UWAGA! Wyczyścić listę mapowanie_osob_bn_pbl_po_imporcie (za dużo niepoprawnych relacji pbl-bn po ostatnim imporcie) Przed rozpoczęciem pracy zaktualizuj zgodnie z obecnym stanem bazy listę książek na dysku za poprzedni rocznik. Przed rozpoczęciem pracy wyszukaj frazy “bezpiecznik” i “aktualizacja”.

bn_ks <- chunk1
#wczytanie listy utożsamionych twórców z autorami BN
#bezpiecznik: użyć sheets_auth() z konsoli
pbl_viaf <- sheets_read(ss = "1cEz73dGN2r2-TTc702yne9tKfH9PQ6UyAJ2zBSV6Jb0") %>%
  filter(czy_ten_sam!="nie") %>%
  select(pbl_id, BN_id, BN_name) %>%
  mutate(BN_name = str_replace_all(BN_name,"\\|\\(", " ("),
         BN_name = str_replace_all(BN_name, "\\;\\|", "; ")) %>%
  cSplit(.,"BN_name",sep = "|",direction = "long") %>%
  filter(BN_name!="")
pbl_viaf2 <- sheets_read(ss = "1_Bhwzo0xu4yTn8tF0ZNAZq9iIAqIxfcrjeLVCm_mggM") %>%
  filter(czy_ten_sam!="nie") %>%
  select(pbl_id, BN_id, BN_name) %>%
  mutate(BN_name = str_replace_all(BN_name,"\\|\\(", " ("),
         BN_name = str_replace_all(BN_name, "\\;\\|", "; ")) %>%
  cSplit(.,"BN_name",sep = "|",direction = "long") %>%
  filter(BN_name!="")
pbl_viaf3 <- sheets_read(ss = "1L-7Zv9EyLr5FeCIY_s90rT5Hz6DjAScCx6NxfuHvoEQ") %>%
  filter(czy_ten_sam!="nie") %>%
  select(pbl_id, BN_id, BN_name) %>%
  mutate(BN_name = str_replace_all(BN_name,"\\|\\(", " ("),
         BN_name = str_replace_all(BN_name, "\\;\\|", "; ")) %>%
  cSplit(.,"BN_name",sep = "|",direction = "long") %>%
  filter(BN_name!="")
pbl_viaf <- rbind(pbl_viaf,pbl_viaf2, pbl_viaf3) %>%
  arrange(pbl_id) %>%
  unique()
remove(pbl_viaf2)
remove(pbl_viaf3)

#zostawić do testowania, czy jedno hasło bn nie zasila kilku haseł twórców pbl
#pbl_viaf <- sheets_read(ss = "1cEz73dGN2r2-TTc702yne9tKfH9PQ6UyAJ2zBSV6Jb0") %>%
#  filter(czy_ten_sam!="nie") %>%
#  select(pbl_id, BN_id, BN_name)
#pbl_viaf2 <- sheets_read(ss = "1_Bhwzo0xu4yTn8tF0ZNAZq9iIAqIxfcrjeLVCm_mggM") %>%
#  filter(czy_ten_sam!="nie") %>%
#  select(pbl_id, BN_id, BN_name)
#pbl_viaf <- rbind(pbl_viaf,pbl_viaf2) %>%
#  arrange(pbl_id) %>%
#  unique()
#
#count <- as.data.frame(table(pbl_viaf$BN_id))
#pbl_viaf <- merge(pbl_viaf,count,by.x = "BN_id",by.y = "Var1",all.x = TRUE)
#pbl_viaf <- pbl_viaf %>%
#  unique()
#count2 <- as.data.frame(table(pbl_viaf$pbl_id))

#utożsamianie po nazewnictwie z informacją o dziale
tworca_i_dzial <- dbGetQuery(PBL,
                             "select tw.tw_tworca_id \"pbl_id\", dz.dz_dzial_id||'|'||dz.dz_nazwa \"osoba_pbl_dzial_id_name\"
                              from pbl_tworcy tw
                              full join pbl_dzialy dz on dz.dz_dzial_id=tw.tw_dz_dzial_id")

#listy nazwisk BN ze zbioru
#100
marc_field_100 <- bn_ks %>%
  select(id,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(bn_ks$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
marc_field_100 <- marc_field_100 %>%
  select(id,`$a`,`$d`,`$c`) %>%
  mutate(name = ifelse(!is.na(`$c`)&substr(`$c`,nchar(`$c`),nchar(`$c`))==";",paste(`$a`,`$c`,`$d`,sep = " "),ifelse(!is.na(`$d`),paste(`$a`,`$d`,sep = " "),as.character(`$a`)))) %>%
  select(id,name) %>%
  mutate(name = str_replace(name,"(\\))(\\.$)","\\1"),
         name = str_replace(name, "([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)","\\1"))

osoba_bn_100_pbl <- marc_field_100 %>%
  unique() %>%
  inner_join(.,pbl_viaf,by = c("name" = "BN_name")) %>%
  select(1:3) %>%
  left_join(.,tworca_i_dzial,by = "pbl_id") %>%
  select(id,osoba_pbl_dzial_id_name) %>%
  group_by(id) %>%
  mutate(osoba_bn_autor = paste(unique(osoba_pbl_dzial_id_name),collapse = "~")) %>%
  select(-osoba_pbl_dzial_id_name) %>%
  ungroup() %>%
  unique()

#600
marc_field_600 <- bn_ks %>%
  select(id,X600)%>%
  filter(X600!="") %>%
  mutate(X600=str_replace_all(X600,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X600",sep = "~",direction = "long") %>%
  filter(X600!="") %>%
  mutate(X600=str_remove_all(X600,"^\\|")) %>%
  mutate(indicator = str_replace_all(X600,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(bn_ks$X600,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_600)[1]))
colnames(empty_table) <-subfield_list
marc_field_600<-cbind(marc_field_600,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")
x <- 1:length(subfield_list)

for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_600$X600 <- str_replace(marc_field_600$X600,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_600[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_600$X600),str_replace_all(gsub(string,"\\3",marc_field_600$X600),"\\${2}.", "~"),NA)
}
marc_field_600 <- marc_field_600 %>%
  select(id,`$a`,`$d`,`$c`) %>%
  mutate(name = ifelse(!is.na(`$c`)&substr(`$c`,nchar(`$c`),nchar(`$c`))==";",paste(`$a`,`$c`,`$d`,sep = " "),ifelse(!is.na(`$d`),paste(`$a`,`$d`,sep = " "),as.character(`$a`)))) %>%
  select(id,name) %>%
  mutate(name = str_replace(name,"(\\))(\\.$)","\\1"),
         name = str_replace(name, "([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)","\\1"))
osoba_bn_600_pbl <- marc_field_600 %>%
  unique() %>%
  inner_join(.,pbl_viaf,by = c("name" = "BN_name")) %>%
  select(1:3) %>%
  left_join(.,tworca_i_dzial,by = "pbl_id") %>%
  select(id,osoba_pbl_dzial_id_name) %>%
  group_by(id) %>%
  mutate(osoba_bn_temat = paste(unique(osoba_pbl_dzial_id_name),collapse = "~")) %>%
  select(-osoba_pbl_dzial_id_name) %>%
  ungroup() %>%
  unique()

bn_ks <- bn_ks %>%
  full_join(.,osoba_bn_100_pbl,by = "id") %>%
  full_join(.,osoba_bn_600_pbl,by = "id")

#bezpiecznik!
#sprawdzić
#jeśli obiekt bezpiecznik będzie miał jakiekolwiek wiersze, to oznacza, że w pliku "mapowanie_osob_bn_pbl" jest wiersz z twórcą, którego nie ma w bazie lub jego identyfikator jest błędny
#jeśli obiekt bezpiecznik jest pusty - to wszystko okej
# sprawdz czy id tworcy z ktorejs tabeli na dysku istnieje w bazie oracle, jesli nie, wklej id tworcy z oracla do tabeli lub - jeśli nie ma takiego twórcy w bazie usuń wiersz w tabeli. Następnie dopisz fragment kodu, by usunąć kolumny osoba_bn_autor i osoba_bn_temat (po tej operacji usuń dopisany kod) i uruchom chunk ponownie

# bn_ks <- bn_ks %>% 
#   select(-osoba_bn_autor,-osoba_bn_temat)

bezpiecznik <- bn_ks %>% 
  filter(osoba_bn_autor=="NA")
chunk2 <- bn_ks
#wskazanie interesujących PBL dziedzin wiedzy po UKD i określenie typu UKD
bn_ks <- chunk2 %>%
  mutate(dziedzina_PBL = ifelse(str_detect(X080,"(?<=\\$a|:|\\[|\\+|\\()(82)"),"ukd_lit",
                                ifelse(str_detect(X080,"(?<=\\$a|:|\\[|\\+)(791)")|str_detect(X080,"(?<=\\$a|:)(792)")|str_detect(X080,"\\$a7\\.09"),"ukd_tfrtv",
                                       ifelse(str_detect(X080,"(?<=\\$a01)(\\(|\\/|2|4|5|9)")|str_detect(X080,"(?<=\\$a|\\[])(050)")|str_detect(X080,"(?<=\\$a|:|\\[|\\+|\\()(811\\.162)"),"ukd_biblio",
                                              ifelse(str_detect(X080,"\\$a002")|str_detect(X080,"(?<=\\$a|:)(305)")|str_detect(X080,"(?<=\\$a39|:39)(\\(438\\)|8\\.2)")|str_detect(X080,"(?<=\\$a|:)(929[^\\.]051)")|str_detect(X080,"(?<=\\$a|:)(929[^\\.]052)"),"ukd_pogranicze","bez_ukd_PBL")))))

#ograniczenie rekordów z ukd językowym
biblio <- bn_ks %>% 
  select(id, X008, X009, X015, X041, X044, X080, X100, X245, X246, X250, X260, X300, X380, X386, X490, X500, X501, X546, X600, X650, X655, X700, X710, X800, X830, rok, BN_URL, osoba_bn_autor, osoba_bn_temat, dziedzina_PBL) %>% 
  filter(dziedzina_PBL=="ukd_biblio")
dobre_biblio <- biblio %>% 
  filter(!grepl("Podręczniki dla dzieci|Podręczniki dla szkół podstawowych",X655),
         !grepl("szkoły podstawowe|rozmówki|nauczanie|logopedia",X650,ignore.case = TRUE),
         !grepl("811\\.162\\.1\\(075\\.2\\)|811\\.162\\'24\\(078\\)",X080),
         !grepl("ćwiczenia i zadania|poradniki dla nauczycieli|słownik.*?\\-polski|słownik polsko\\-|Słowniki dla dzieci",X655,ignore.case = TRUE),
         !(grepl("Podręczniki",X655)&grepl("Kształcenie nauczycieli",X650)))
dobre_biblio2 <- biblio %>% 
  filter(!(is.na(osoba_bn_autor)&is.na(osoba_bn_temat)))
dobre_biblio <- dobre_biblio %>% 
  bind_rows(dobre_biblio2 %>% filter(id %notin% dobre_biblio$id))
zle_biblio <- biblio %>% 
  filter(id %notin% dobre_biblio$id)
bn_ks$dziedzina_PBL[bn_ks$id %in% zle_biblio$id] <- NA

#wskazanie interesujących PBL rekordów bez UKD, które są w kluczu PBL
bez_ukd_ale_PBL <- bn_ks %>%
  select(id, X080, X650, X655, osoba_bn_autor, osoba_bn_temat, dziedzina_PBL) %>%
  filter(dziedzina_PBL == "bez_ukd_PBL"&X080==""&is.na(osoba_bn_autor)&is.na(osoba_bn_temat)) %>%
  mutate(bez_ukd_ale_PBL = grepl("literat|literac|pisar|bajk|dramat|epigramat|esej|felieton|film|komedi|nowel|opowiadani|pamiętnik|poemiks|poezj|powieść|proza|reportaż|satyr|wspomnieni|Scenariusze zajęć|Podręczniki dla gimnazjów|teatr|Nagrod|aforyzm|baśń|baśnie|polonijn|dialogi|fantastyka naukowa|legend|pieśń|poemat|przypowieś|honoris causa|filologi|kino polskie|pieśni|interpretacj",X650, ignore.case = TRUE)|grepl("literat|literac|pisar|bajk|dramat|epigramat|esej|felieton|film|komedi|nowel|opowiadani|pamiętnik|poemiks|poezj|powieść|proza|reportaż|satyr|wspomnieni|Scenariusze zajęć|Podręczniki dla gimnazjów|teatr|Nagrod|aforyzm|baśń|baśnie|polonijn|dialogi|fantastyka naukowa|legend|pieśń|poemat|przypowieś|honoris causa|filologi|kino polskie|pieśni|interpretacj",X655,ignore.case = TRUE)) %>%
  filter(bez_ukd_ale_PBL == TRUE) %>%
  select(id) %>%
  mutate(bez_ukd_ale_PBL = "tak")

bn_ks <- bn_ks %>%
  full_join(.,bez_ukd_ale_PBL,by = "id")

#Biblia
biblia <- bn_ks %>% 
  filter(grepl("biblia", X630, ignore.case = TRUE), 
         grepl("analiza i interpretacja|edycja krytyczna|materiały konferencyjne", X655, ignore.case = TRUE)) %>% 
  select(id) %>% 
  mutate(czy_biblia = "tak")

bn_ks <- bn_ks %>%
  full_join(biblia,by = "id")

#wspomnienia,pamiętniki,literatura podróżnicza,reportaż
wspomnienia <- bn_ks %>%
  mutate(czy_wspomnienia_reportaz = ifelse(str_detect(X655,"Pamiętniki i wspomnienia")|str_detect(X655,"Literatura podróżnicza")|str_detect(X655,"Pamiętniki")|str_detect(X655,"Reportaż")|str_detect(X655,"Relacja z podróży"),"tak",NA)) %>%
  select(id,czy_wspomnienia_reportaz) %>%
  unique()
bn_ks <- bn_ks %>%
  full_join(.,wspomnienia,by = "id")

#słowa literackie w polu 245
rekordy_slowa <- sqldf("select *
                    from bn_ks a
                    where LOWER(a.X245) like ('%'||'pisar'||'%')
                   or LOWER(a.X245) like ('%'||'literat'||'%')
                   or LOWER(a.X245) like ('%'||'literac'||'%')
                   or LOWER(a.X245) like ('%'||'teatr'||'%')
                   or LOWER(a.X245) like ('%'||'film'||'%')
                   or LOWER(a.X245) like ('%'||'dramat'||'%')
                   or LOWER(a.X245) like ('%'||'interpretacj'||'%')") %>%
  select(id) %>%
  mutate(slowa_literackie = "tak") %>%
  unique()
bn_ks <- bn_ks %>%
  full_join(.,rekordy_slowa,by = "id")

bn_ok <- bn_ks %>%
  filter(!((is.na(osoba_bn_autor)&is.na(osoba_bn_temat))&dziedzina_PBL=="bez_ukd_PBL"&is.na(bez_ukd_ale_PBL)&is.na(czy_wspomnienia_reportaz)&is.na(slowa_literackie)&is.na(czy_biblia)))

#interpretacje nieliterackie
zle_interpretacje <- bn_ok %>% 
  filter(grepl("interpretacj",X245,ignore.case = TRUE)|grepl("interpretacj",X650,ignore.case = TRUE)|grepl("interpretacj",X245,ignore.case = TRUE)) %>% 
  filter(grepl("\\$a336|\\$a342|\\$a32|\\$a551|\\$a616|\\$a159\\.961",X080)|grepl("prawn|handl|handel|kodeks|prac|ustaw|administrac|spółka|spółek|prawa|podatk",X655,ignore.case = TRUE)|grepl("prawn|handl|handel|kodeks|prac|ustaw|administrac|spółka|spółek|prawa|podatk",X650,ignore.case = TRUE)|grepl("prawn|handl|handel|kodeks|ustaw|administrac|spółka|spółek|prawa|podatk",X245,ignore.case = TRUE))

bn_ok <- bn_ok %>% 
  filter(id %notin% zle_interpretacje$id)

#usuwanie zdublowanych książek
#020
marc_field_020 <- bn_ok %>%
  select(id,X020)%>%
  filter(X020!="") %>%
  mutate(X020=str_replace_all(X020,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X020",sep = "~",direction = "long") %>%
  filter(X020!="") %>%
  mutate(X020=str_remove_all(X020,"^\\|")) %>%
  mutate(indicator = str_replace_all(X020,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(bn_ok$X020,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_020)[1]))
colnames(empty_table) <-subfield_list
marc_field_020<-cbind(marc_field_020,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_020$X020 <- str_replace(marc_field_020$X020,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_020[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_020$X020),str_replace_all(gsub(string,"\\3",marc_field_020$X020),"\\${2}.", "~"),NA)
}
marc_field_020 <- marc_field_020 %>%
  select(id,isbn=`$a`)

distance1 <- bn_ok %>%
  filter(!grepl("\\$n",X245)) %>%
  left_join(.,marc_field_020,by="id") %>%
  mutate(porownanie = paste(isbn,substr(str_to_lower(str_replace_all(X245, "\\W", "")),4,14),str_extract(X300,"(?<=\\$a)(.*?)(?=,| )"),sep = "|"))

count <- as.data.frame(table(distance1$porownanie))

distance1 <- merge(distance1,count,by.x = "porownanie",by.y = "Var1",all.x = TRUE) %>%
  select(porownanie,Freq,2:155) %>%
  arrange(-Freq,porownanie) %>%
  select(porownanie,Freq,id) %>%
  cSplit(.,"porownanie",sep = "|",direction = "wide") %>% 
  arrange(porownanie_2,porownanie_3,porownanie_1,-Freq,id)
count <- as.data.frame(table(distance1$porownanie_2,distance1$porownanie_3)) %>% 
  filter(Freq>0)
distance1 <- distance1 %>% 
  left_join(.,count,by=c("porownanie_2"="Var1","porownanie_3"="Var2")) %>% 
  arrange(porownanie_2,porownanie_3,-Freq.y,porownanie_1,-Freq.y,id) %>% 
  group_by_at(vars(4:6)) %>% 
  fill(porownanie_1) %>% 
  ungroup() %>% 
  unique() %>% 
  select(-Freq.y) %>% 
  rename(Freq = Freq.x)

#poszukanie dystansu Levenshteina == 1 przy takim samym ISBN
distance2 <- distance1 %>%
  filter(!is.na(porownanie_1)) %>%
  group_by(porownanie_1) %>%
  mutate(Freq = paste(Freq,collapse = "|"),
         id = paste(id,collapse = "|"),
         porownanie_2 = paste(porownanie_2,collapse = "|"),
         porownanie_3 = paste(porownanie_3,collapse = "|")) %>%
  ungroup() %>%
  unique() %>%
  mutate(ile = str_count(porownanie_2,"\\|")+1) %>%
  arrange(-ile) %>%
  mutate(id_grupy = 1:lengths(.)) %>%
  filter(ile>1) %>%
  cSplit(.,c("Freq","id","porownanie_2","porownanie_3"),sep = "|",direction = "long") %>%
  unique() %>%
  filter(!is.na(id))

permutations <- data.frame(stringsAsFactors = FALSE)
x <- 1:max(distance2$id_grupy)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  distance3 <- as.vector(unlist(distance2 %>% filter(id_grupy==i) %>% select(porownanie_2)))
  iteration <- as.data.frame(permutations(distance3,2)) %>%
    mutate(id_grupy = i)
  y <- 1:length(iteration$V1)
  for (j in y) {
    progress(match(j,y), max.value = length(y))
    iteration$distance[j] <- adist(iteration$V1[j],iteration$V2[j])
  }
  permutations <- rbind(permutations,iteration)
}

permutations <- permutations %>%
  filter(distance<=1)

distance2 <- distance2 %>%
  filter(id_grupy %in% permutations$id_grupy) %>%
  select(id,id_grupy)
#połączyć distance2 z distance1, żeby wydobyć pełną listę zdublowanych książek
duble_ksiazek <- distance1 %>%
  unite("porownanie", porownanie_1:porownanie_3, sep = "|") %>%
  filter(Freq>1) %>%
  full_join(.,distance2,by="id")

duble_ksiazek$same <- cumsum(!duplicated(duble_ksiazek$porownanie))

duble_ksiazek <- duble_ksiazek %>%
  arrange(id_grupy,same) %>%
  mutate(id_grupy_dubli = ifelse(!is.na(id_grupy),as.character(id_grupy),paste("x",same,sep = ""))) %>%
  select(id,id_grupy_dubli) %>%
  arrange(id_grupy_dubli)

duble_ksiazek$id_grupy_dubli <- cumsum(!duplicated(duble_ksiazek$id_grupy_dubli))
#uzupełnienie całego zbioru o informację o dublu, wydobycie dubli do osobnego pliku i usuniecie ich z głównego pliku z rekordami bn; wskazanie listy interesujących pól
bn_ok <- bn_ok %>%
  left_join(.,duble_ksiazek,by="id") %>%
  select(id, X008, X009, X015, X041, X044, X080, X100, X245, X246, X250, X260, X300, X380, X386, X490, X500, X501, X546, X600, X650, X655, X700, X710, X800, X830, rok, BN_URL, osoba_bn_autor, osoba_bn_temat, dziedzina_PBL, bez_ukd_ale_PBL, czy_wspomnienia_reportaz, slowa_literackie, czy_biblia, id_grupy_dubli)

duble_ksiazek <- bn_ok %>%
  filter(!is.na(id_grupy_dubli)) %>%
  arrange(id_grupy_dubli)

bn_ok <- bn_ok %>%
  filter(is.na(id_grupy_dubli))
#wpisanie w zdublowane rekordy jak największej ilości danych (suma wszystkich dubli)
duble_ksiazek <- duble_ksiazek %>%
  arrange(id_grupy_dubli,-nchar(X015))
duble_ksiazek[is.na(duble_ksiazek)] <- ""
duble_naprawione <- data.frame(stringsAsFactors = FALSE)
x <- 1:max(duble_ksiazek$id_grupy_dubli)
y <- c(4:27,29:34)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  iteration <- duble_ksiazek %>%
    filter(id_grupy_dubli==i)
  for (j in y) {
    if (j==30) {
      iteration[,j] <- iteration[,j][nchar(iteration[,j])==min(nchar(iteration[,j]))][1]
    } else {
        iteration[,j] <- iteration[,j][nchar(iteration[,j])==max(nchar(iteration[,j]))][1]
      }
  }
  duble_naprawione <- rbind(duble_naprawione,iteration)
}
#pozostawienie pojedynczych wierszy dla książek
duble_naprawione <- duble_naprawione[!duplicated(duble_naprawione$id_grupy_dubli),]
duble_naprawione <- duble_naprawione %>%
  mutate(osoba_bn_autor = ifelse(osoba_bn_autor!="",as.character(osoba_bn_autor),NA),
         osoba_bn_temat = ifelse(osoba_bn_temat!="",as.character(osoba_bn_temat),NA),
         dziedzina_PBL = ifelse(dziedzina_PBL!="",as.character(dziedzina_PBL),NA),
         bez_ukd_ale_PBL = ifelse(bez_ukd_ale_PBL!="",as.character(bez_ukd_ale_PBL),NA),
         czy_wspomnienia_reportaz = ifelse(czy_wspomnienia_reportaz!="",as.character(czy_wspomnienia_reportaz),NA),
         slowa_literackie = ifelse(slowa_literackie!="",as.character(slowa_literackie),NA),)
#połączenie unikatowych książek z dubli z całym zbiorem
bn_ok <- bn_ok %>%
  bind_rows(.,duble_naprawione) %>%
  select(-id_grupy_dubli)

#usunięcie zagranicznych zapisów, które nie są polonikami 
#na podstawie braku wystąpień frazy "pol" w polach MARC
nie_poloniki <- bn_ok %>%
  filter(if (X501=="") !grepl("pl",substr(X008,16,18))) %>%
  filter(!grepl("pol",substr(X008,36,38))) %>%
  filter(!grepl("pol",X041)) %>%
  filter(!grepl("pl",X044)) %>%
  filter(!grepl("pol",X500,ignore.case = TRUE)) %>%
  filter(!grepl("pol",X501,ignore.case = TRUE)) %>%
  filter(!grepl("pol",X546,ignore.case = TRUE)) %>%
  select(id) %>%
  mutate(czy_polonik = "nie") %>%
  unique()

bn_ok <- bn_ok %>%
  full_join(.,nie_poloniki,by = "id") %>%
  select(id, X008, X009, X041, X044, X080, X100, X245, X246, X250, X260, X300, X380, X386, X490, X500, X501, X500, X546, X600, X650, X655, X700, X710, X800, X830, rok, BN_URL, osoba_bn_autor, osoba_bn_temat, dziedzina_PBL, bez_ukd_ale_PBL, czy_wspomnienia_reportaz, slowa_literackie, czy_polonik, czy_biblia) %>%
  unique()
#wskazanie niepoloników i usunięcie ze zbioru
nie_poloniki <- bn_ok %>%
  filter(czy_polonik=="nie") %>%
  filter(is.na(osoba_bn_autor)|is.na(osoba_bn_temat)|!(osoba_bn_autor %in% c("148|Hasła osobowe (literatura polska)","430|Hasła osobowe (Ludzie teatru i filmu)"))|!(osoba_bn_temat %in% c("148|Hasła osobowe (literatura polska)","430|Hasła osobowe (Ludzie teatru i filmu)")))
bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from nie_poloniki b)") %>%
  select(-czy_polonik)

#usunięcie książek zabawek, do kolorowania, dla małych dzieci, z naklejkami, które nie mają żadnego deskryptora gatunkowego
ks_zabawki <- bn_ok %>% 
  filter((str_count(X655,"\\$a")==1&grepl("Książka zabawka|Książki dla małych dzieci|Książka do kolorowania|Książka z naklejkami|Książki dla przedszkolaków|Wydawnictwa dla dzieci",X655))|str_count(X655,"\\$a")==2&grepl("Książka obrazkowa",X655)&grepl("Książki dla małych dzieci",X655)|str_count(X655,"\\$a")==2&grepl("Książka do kolorowania",X655)&grepl("Publikacje dla dzieci",X655)|str_count(X655,"\\$a")==2&grepl("Książki zabawki",X655)&grepl("Wycinanki",X655)|str_count(X655,"\\$a")==2&grepl("Książki dla małych dzieci",X655)&grepl("Publikacje dla dzieci",X655))

bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from ks_zabawki b)")
chunk3 <- bn_ok
bn_ok <- chunk3
#pobranie starych list książek z importu
#aktualizacja - uzupełnij ostatni brakujący zaimportowany rocznik
listy_2010 <- sheets_read(ss = "1Vjeg0JsYI-8v9B-x_yyujIhmw7UR7Lk7poexrHNdVzM", sheet = "lista_ksiazek")
listy_2009 <- sheets_read(ss = "1Gc4gQSm9b4NDTQysiauzW9Jac6yP0oNuFbB8utO4kS4", sheet = "lista_ksiazek")
listy_2005 <- sheets_read(ss = "1HkWkX61sQWktSXf0v0uPV8j2DwuTocesyCJuKTdisIU", sheet = "lista_ksiazek")
listy_2006 <- sheets_read(ss = "1zeMx_Idsum8JmlM6G7Eufx9LxloHoAHv8V-My71VZf4", sheet = "lista_ksiazek")
listy_2007 <- sheets_read(ss = "19iL7YoD8ug-rLnpzS6FD46aS2J1BRf4qL5VxllywCGE", sheet = "lista_ksiazek")
listy_2008 <- sheets_read(ss = "1RshTeWdXBE7OzOEfoGpL9Ljb_GXDlGDePNjV1HKmuOo", sheet = "lista_ksiazek")
listy_2004 <- sheets_read(ss = "1RmDia97s4B8F74sS7Wbpnv_A9zMfr4xTvcD9leukAfM", sheet = "lista_książek") %>%
  mutate(typ_ksiazki = NA, link = NA, link_1 = NA, status = NA, blad_w_imporcie_tytulu = NA) %>%
  select(pracownik,ZA_ZAPIS_ID,typ_ksiazki, link, link_1, rok, status, blad_w_imporcie_tytulu, X100, X245, X650, X655, X246, X250, X260, X300, X380, X490, X500, X501, X546, X600, X700, X041, X080)
#ujednolicenie 2004 do wzoru późniejszych rocznikóW
do2004 <- RJDBC::dbGetQuery(PBL,
                            "select z.za_zapis_id, z.za_status_imp
                            from pbl_zapisy z
                            where z.za_uwagi like '%import%02%'")
listy_2004 <- merge(listy_2004,do2004,by = "ZA_ZAPIS_ID",all.x = TRUE) %>%
  mutate(status = ZA_STATUS_IMP) %>%
  select(-ZA_STATUS_IMP) %>%
  select(pracownik,ZA_ZAPIS_ID,typ_ksiazki, link, link_1, rok, status, blad_w_imporcie_tytulu, X100, X245, X650, X655, X246, X250, X260, X300, X380, X490, X500, X501, X546, X600, X700, X041, X080)
#zapewnienie tych samych nazw kolumn
#aktualizacja - wprowadź wiersz dla ostatniego zaimportowanego rocznika
colnames(listy_2010) <- names(listy_2004)
colnames(listy_2009) <- names(listy_2004)
colnames(listy_2005) <- names(listy_2004)
colnames(listy_2006) <- names(listy_2004)
colnames(listy_2007) <- names(listy_2004)
colnames(listy_2008) <- names(listy_2004)
listy_2004 <- listy_2004 %>%
  mutate(X655 = str_remove(str_replace_all(X655,"(\\$a)","|\\1"),"^\\|"),
         X650 = str_remove(str_replace_all(X650,"(\\$a)","|\\1"),"^\\|"))

#wyznaczenie listy 650 i 655 do automatycznego INO na podstawie wcześniejszych importów - usunięte są tylko te deskryptory, które nie mają związku z literaturą podmiotową
zapisy <- RJDBC::dbGetQuery(PBL,
                            "select z.za_zapis_id, z.za_status_imp, z.za_uwagi, z.za_adnotacje
                            from pbl_zapisy z
                            where z.za_uwagi like '%import%'") %>%
  mutate(pracownik_pbl = str_extract(ZA_UWAGI, "(?<=akceptuje:)([A-Z]*)")) %>%
  select(ZA_ZAPIS_ID,pracownik_pbl,ZA_STATUS_IMP,ZA_ADNOTACJE)
#aktualizacja - dodaj do skryptu listę z ostatnim brakującym zaimportowanym rocznikiem
do_importu_NIE <- rbind(listy_2004,listy_2005,listy_2006,listy_2007,listy_2008, listy_2009, listy_2010) %>%
  full_join(.,zapisy,by = "ZA_ZAPIS_ID") %>%
  select(X650,X655,ZA_STATUS_IMP,ZA_ADNOTACJE) %>%
  mutate(X650 = str_remove_all(X650,"\\\\7"),
         X655 = str_remove_all(X655,"\\\\7"),
         joint = paste(X650,X655,sep = "~")) %>%
  select(ZA_STATUS_IMP,joint,ZA_ADNOTACJE) %>%
  group_by(joint) %>%
  mutate(grupa = paste(ZA_STATUS_IMP,collapse = ","),
         ZA_ADNOTACJE = paste(ZA_ADNOTACJE,collapse = ",")) %>%
  ungroup() %>%
  select(joint, grupa,ZA_ADNOTACJE) %>%
  unique() %>%
  filter(!grepl("rozpisana|rozpisać|rozpisania",ZA_ADNOTACJE)) %>% 
  mutate(ile = str_count(grupa,",")+1) %>%
  filter(grepl("INO",grupa)) %>%
  filter(!grepl("IOK|IMP|IPN|IPC",grupa)) %>%
  mutate(czy = str_detect(joint,"\\$y[\\d-]+ w\\.")) %>%
  filter(czy==FALSE) %>%
  select(joint) %>%
  mutate(joint = str_remove_all(str_replace_all(joint,"(\\$a)","\\\\#7\\1"),"#")) %>%
  mutate(do_wyrzucenia_na_podstawie_INO = "tak")

bn_ok <- bn_ok %>%
  mutate(X650 = ifelse(X650=="",NA,as.character(X650)),
         X655 = ifelse(X655=="",NA,as.character(X655)),
         joint = paste(X650,X655,sep = "~")) %>%
  left_join(.,do_importu_NIE,by = "joint") %>%
  mutate(X650 = ifelse(is.na(X650),"",as.character(X650)),
         X655 = ifelse(is.na(X655),"",as.character(X655)))

do_importu_NIE <- bn_ok %>%
  filter(is.na(osoba_bn_autor)&is.na(osoba_bn_temat)&is.na(slowa_literackie)&do_wyrzucenia_na_podstawie_INO=="tak") %>%
  filter(!grepl("literat|literac|pamiętnik|pisar",X655,ignore.case = TRUE))

bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from do_importu_NIE b)") %>%
  select(-joint,-do_wyrzucenia_na_podstawie_INO)

#usunięcie na podstawie tabel KP
out <- sheets_read(ss = "1lO_ZtwyBDePGqXkgWyk_WmGeQBaAQBvEUjNnctrw-vg") %>%
  filter(wchodzi_do_pbl == "nie")

KP_out <- bn_ok %>%
  filter(grepl("Wydawnictwa popularne",X655)) %>%
  unique() %>%
  full_join(.,out,by = "X650") %>%
  filter(wchodzi_do_pbl=="nie") %>%
  filter(!is.na(X655)) %>%
  select(id)

bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from KP_out b)")

#czy próbować wyrzucać po UKD, które dostawało tylko INO?
#aktualizacja - dodaj do skryptu listę z ostatnim brakującym zaimportowanym rocznikiem
do_importu_NIE2 <- rbind(listy_2004,listy_2005,listy_2006,listy_2007,listy_2008, listy_2009, listy_2010) %>%
  full_join(.,zapisy,by = "ZA_ZAPIS_ID") %>%
  select(X080,ZA_STATUS_IMP) %>%
  mutate(X080 = str_remove_all(X080,"\\\\")) %>%
  select(ZA_STATUS_IMP,X080) %>%
  group_by(X080) %>%
  mutate(grupa = paste(ZA_STATUS_IMP,collapse = ",")) %>%
  ungroup() %>%
  select(X080, grupa) %>%
  unique() %>%
  mutate(ile = str_count(grupa,",")+1) %>%
  filter(grepl("INO",grupa)) %>%
  filter(!grepl("IOK|IMP|IPN|IPC",grupa)) %>%
#tu się musi KP wypowiedzieć, czy jak było 2xNIE to wystarczy, żeby wywalać
#  filter(ile > 1) %>%
  select(X080) %>%
  mutate(X080 = paste("\\",str_remove_all(str_replace_all(X080,"(\\$a)","\\\\#\\1"),"#"),sep = "")) %>%
  mutate(do_wyrzucenia_na_podstawie_INO = "tak")

#na podstawie UKD też wyrzucić - decyzja KP
bn_ok <- bn_ok %>%
  full_join(.,do_importu_NIE2,by = "X080") %>%
  filter(!is.na(id))

do_importu_NIE2 <- bn_ok %>%
  filter(is.na(osoba_bn_autor)&is.na(osoba_bn_temat)&is.na(slowa_literackie)&do_wyrzucenia_na_podstawie_INO=="tak")

bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from do_importu_NIE2 b)") %>%
  select(-do_wyrzucenia_na_podstawie_INO)

#reszta rekordów, które nie będą zaimportowane
reszta <- sqldf("select *
               from bn_ks a
               where a.id not in 
               (select b.id
               from bn_ok b)")
chunk4 <- bn_ok
bn_ok <- chunk4
stare_rodzajowanie <- bn_ok %>%
  mutate(czy_ma_ukd = ifelse(X080=="","nie","tak"),
         position_dash = ifelse(grepl("(\\\\\\\\\\$a|:)(821\\.)",X080),str_locate(X080,"\\-")[,1], NA),
         position_dash = ifelse(is.na(position_dash),"",as.integer(position_dash)),
         position_091 = str_locate(X080,"\\(091\\)")[,1],
         position_091 = ifelse(is.na(position_091),"",as.integer(position_091)),
         rodzaj_ksiazki = ifelse(grepl("Antologi",X655),"antologia",
                                 ifelse(position_091!=""&position_dash!="",
                          ifelse(as.integer(position_091)<as.integer(position_dash), "przedmiotowa", "podmiotowa"),
                          ifelse(position_dash!="","podmiotowa","przedmiotowa"))),
         rodzaj_ksiazki = ifelse(czy_ma_ukd=="nie","",as.character(rodzaj_ksiazki)))
gatunki_podmiotowe <- stare_rodzajowanie %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  select(X655) %>%
  unique() %>%
  cSplit(.,"X655",sep = "|",direction = "long") %>%
  unique() %>%
  filter(str_detect(X655,"\\$y[\\d-]+ w\\."))
gatunki_podmiotowe <- str_replace_all(str_replace_all(paste(gatunki_podmiotowe$X655,collapse = "|"),"(.{2})(\\$a)","\\2"),"\\$","\\\\$")
stare_rodzajowanie$czy_podmiotowy <- grepl(gatunki_podmiotowe,stare_rodzajowanie$X655)|grepl(gatunki_podmiotowe,stare_rodzajowanie$X650)
stare_rodzajowanie <- stare_rodzajowanie %>%
  mutate(rodzaj_ksiazki = ifelse(str_count(X245, " / ")+1>2,"antologia",
                                 ifelse(str_count(X245, " / ")+1==2,"współwydanie",
                                        ifelse(rodzaj_ksiazki==""&czy_podmiotowy==TRUE&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                               ifelse(X100!=""&grepl("aPamiętnik|aLiteratura podróżnicza",X655)&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                                      ifelse(X100!=""&grepl("aReportaż",X655)&grepl("\\$y",X655)&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                                             ifelse(X100!=""&(X655=="\\7$aReportaż polski$2DBN"|X655=="\\7$aReportaż$2DBN")&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                                                    ifelse(rodzaj_ksiazki==""&czy_podmiotowy==FALSE,"przedmiotowa",as.character(rodzaj_ksiazki)))))))),
         rodzaj_ksiazki = ifelse(rodzaj_ksiazki=="","przedmiotowa",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(grepl("Lektury Wszech Czasów : streszczenie, analiza, interpretacja|Lektury Wszech Czasów - Literat|Biblioteczka Opracowań",X490)|grepl("Lektury Wszech Czasów : streszczenie, analiza, interpretacja|Lektury Wszech Czasów - Literat|Biblioteczka Opracowań",X830),"przedmiotowa",as.character(rodzaj_ksiazki)),
         ilu_tworcow = str_count(X100,"\\$a"),
         rodzaj_ksiazki = ifelse(ilu_tworcow>4&rodzaj_ksiazki=="podmiotowa","antologia",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(grepl("Legendy",X655),"antologia",as.character(rodzaj_ksiazki))) %>%
  filter(grepl("katalog wystawy",X655,ignore.case = TRUE)&rodzaj_ksiazki=="przedmiotowa") %>% 
  select(id)

##właściwe rodzajowanie z uwaględnieniem jednego elementu ze starego rodzajowania
bn_ok <- bn_ok %>%
  mutate(czy_ma_ukd = ifelse(X080=="","nie","tak"),
         position_dash = ifelse(grepl("(\\\\\\\\\\$a|:)(821\\.)",X080),str_locate(str_replace(X080,"(.*?)(\\$a821\\.)(.*?$)","\\2\\3"),"\\-")[,1]+nchar(str_replace(X080,"(.*?)(\\$a821\\.)(.*?$)","\\1")), NA),
         position_dash = ifelse(is.na(position_dash),"",as.integer(position_dash)),
         position_091 = str_locate(X080,"\\(091\\)")[,1],
         position_091 = ifelse(is.na(position_091),"",as.integer(position_091)),
         rodzaj_ksiazki = ifelse(grepl("antologi|Przysłowia [\\S]+\\$2|Cytaty\\$2",X655,ignore.case = TRUE),"antologia",
                                 ifelse(position_091!=""&position_dash!="",
                          ifelse(as.integer(position_091)<as.integer(position_dash), "przedmiotowa", "podmiotowa"),
                          ifelse(position_dash!="","podmiotowa","przedmiotowa"))),
         rodzaj_ksiazki = ifelse(czy_ma_ukd=="nie","",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(grepl("82-93",X080)&rodzaj_ksiazki!="antologia","podmiotowa",as.character(rodzaj_ksiazki)))

rekordy_podmiotowe_stare <- dbGetQuery(PBL,
                                       "select z.za_zapis_id
                                        from pbl_zapisy z
                                        join IBL_OWNER.pbl_rodzaje_zapisow rz on rz.rz_rodzaj_id=z.za_rz_rodzaj1_id
                                        where rz.rz_rodzaj_id=1
                                        and z.za_uwagi like '%import%'")
#aktualizacja - dodaj do skryptu listę z ostatnim brakującym zaimportowanym rocznikiem
gatunki_poprzednie_imp <- rbind(listy_2004,listy_2005,listy_2006,listy_2007,listy_2008, listy_2009, listy_2010) %>% 
  filter(ZA_ZAPIS_ID %in% rekordy_podmiotowe_stare$ZA_ZAPIS_ID) %>% 
  mutate(X655 = ifelse(rok==2004,str_remove_all(str_replace_all(X655,"(\\$a)","\\\\#7\\1"),"#"),as.character(X655))) %>% 
  select(X655) %>% 
  unique()

gatunki_podmiotowe <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  select(X655) %>%
  bind_rows(.,gatunki_poprzednie_imp) %>% 
  unique() %>%
  cSplit(.,"X655",sep = "|",direction = "long") %>%
  unique() %>%
  filter(!grepl("xhistoria|xtematyka|xbiografia",X655)) %>% 
  filter(str_detect(X655,"\\$y[\\d-]+ w\\."), 
         grepl("( \\S+)(\\$y)(.*?$)", X655)) %>% 
  #mutate(X655 = str_replace(X655, "(?<= )(\\S+)(\\$y)(.*?$)", "[\\\\S]+\\2")) %>% 
  mutate(X655 = str_replace(X655, "(?<= )(\\S+)(\\$y)(.*?$)", ".+\\2")) %>% 
  unique()

gatunki_podmiotowe <- str_replace_all(str_replace_all(str_replace_all(paste(gatunki_podmiotowe$X655,collapse = "|"),"(.{2})(\\$a)","\\2"),"\\$","\\\\$"), "\\(", "\\\\\\(")
bn_ok$czy_podmiotowy <- grepl(gatunki_podmiotowe,bn_ok$X655)|grepl(gatunki_podmiotowe,bn_ok$X650)
bn_ok <- bn_ok %>%
  mutate(rodzaj_ksiazki = ifelse(str_count(X245, " \\/ ")+1>2,"antologia",
                                 ifelse(str_count(X245, " \\/ \\[{0,1}[A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽ]")+1==2,"współwydanie",
                                        ifelse(rodzaj_ksiazki==""&czy_podmiotowy==TRUE&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                               ifelse(X100!=""&grepl("aPamiętnik|aLiteratura podróżnicza",X655)&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                                      ifelse(X100!=""&grepl("aReportaż",X655)&grepl("\\$y",X655)&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                                             ifelse(X100!=""&(X655=="\\7$aReportaż polski$2DBN"|X655=="\\7$aReportaż$2DBN")&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                                                    ifelse(rodzaj_ksiazki==""&czy_podmiotowy==FALSE,"przedmiotowa",as.character(rodzaj_ksiazki)))))))),
         rodzaj_ksiazki = ifelse(rodzaj_ksiazki=="","przedmiotowa",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(grepl("Lektury Wszech Czasów \\: streszczenie, analiza, interpretacja|Lektury Wszech Czasów - Literat|Biblioteczka Opracowań",X490)|grepl("Lektury Wszech Czasów \\: streszczenie, analiza, interpretacja|Lektury Wszech Czasów - Literat|Biblioteczka Opracowań",X830),"przedmiotowa",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(grepl("aLektura z Opracowaniem - Zielona Sowa|aLektura \\(Greg\\)|aLektura Dobrze Opracowana|aLektura z Opracowaniem - Ibis",X830),"podmiotowa",as.character(rodzaj_ksiazki)),
         ilu_tworcow = str_count(X100,"\\$a"),
         rodzaj_ksiazki = ifelse(ilu_tworcow>4&rodzaj_ksiazki=="podmiotowa","antologia",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(grepl("Legendy|\\$vantologi",X655),"antologia",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(str_count(X100, "\\|")==0&X100!=""&rodzaj_ksiazki=="antologia"&grepl("Legendy i podania|Antologia",X655),"podmiotowa",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(X100==""&str_count(X700,"\\$t")==3&grepl("Harlequin",X260),"antologia",as.character(rodzaj_ksiazki))) %>%
  select(1:34,rodzaj_ksiazki)


# przypisania do podmiotowej na podstawie smierci przed 1700
marc_field_100 <- bn_ok %>%
  filter(!is.na(osoba_bn_autor)) %>%
  select(id,X100)%>%
  filter(!grepl("\\|", X100)) %>% 
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(bn_ok$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}

marc_field_100 <- marc_field_100 %>% 
  filter(!is.na(`$d`) & str_extract(`$d`, "\\d+(?!.*\\d+)") < 1700)

bn_ok <- bn_ok %>% 
  mutate(rodzaj_ksiazki = ifelse(id %in% marc_field_100$id, "podmiotowa", as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(id %in% stare_rodzajowanie$id, "przedmiotowa",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(X080=="\\\\$a82-1/-9(0.054)"&rodzaj_ksiazki=="przedmiotowa"&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(rodzaj_ksiazki=="podmiotowa"&grepl("aut\\.",X245)&grepl("et al\\.",X245),"antologia",as.character(rodzaj_ksiazki)))
chunk5 <- bn_ok
bn_ok <- chunk5
IOK_podm <- bn_ok %>%
  filter(!grepl("\\$t",X700)) %>%
  mutate(ile_gatunkow = ifelse(rodzaj_ksiazki=="podmiotowa",str_count(X655,"\\$a"),"nie"),
         tylko_podmiotowe = ifelse(str_count(X655,"\\$a")>0&str_count(X655,"\\$a")==str_count(X655,"\\$y")&str_count(X655,"\\$y")!=str_count(X655,"\\$x"),"tak","nie")) %>%
  filter(str_count(X100,"\\$a")==1) %>%
  filter(!grepl("pseud|nazwa",X500,ignore.case = TRUE)&X501==""&(tylko_podmiotowe=="tak"|ile_gatunkow=="1")&X100!="")

#zestawienie 100 i 245
#100
marc_field_100 <- IOK_podm %>%
  select(id,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(IOK_podm$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
marc_field_100 <- marc_field_100 %>%
  select(id,`$a`) %>%
  mutate(bn_nazwisko = ifelse(str_detect(`$a`,","),str_replace(`$a`,"^(.*?)(, )(.*?$)","\\1"),as.character(`$a`)),
         bn_imie = ifelse(str_detect(`$a`,","),str_replace(`$a`,"^(.*?)(, )(.*?$)","\\3"),"")) %>%
  select(id,bn_nazwisko,bn_imie)

IOK_podm <- IOK_podm %>%
  full_join(.,marc_field_100,by = "id")

x <- 1:length(IOK_podm$id)
for (i in x) {
  
  IOK_podm$czy_nazwisko[i] <- grepl(IOK_podm$bn_nazwisko[i],IOK_podm$X245[i])
  IOK_podm$czy_imie[i] <- grepl(IOK_podm$bn_imie[i],IOK_podm$X245[i])
  
}
#usunięcie tych, które nie mają tytułów oryginalnych
IOK_podm <- IOK_podm %>%
  filter(czy_nazwisko==1&czy_imie==1&!grepl("et al\\.",X245)) %>%
  select(-bn_nazwisko,-bn_imie,-czy_nazwisko,-czy_imie) %>%
  unique() %>%
  mutate(jezyk = str_extract(X041,("(?<=\\$h)(...)"))) %>%
  mutate(czy_tytul_obcy = ifelse(is.na(jezyk),"nie dotyczy",
                                 ifelse(!grepl("pol",jezyk),
                                        ifelse(X246!="","ok",
                                               ifelse(grepl("Tyt[,\\.] oryg",X501)|grepl("Tyt[,\\.] oryg",X500),"ok","problem")),"nie dotyczy"))) %>%
  filter(czy_tytul_obcy!="problem") %>%
  select(id) %>%
  mutate(automatyczna_podmiotowa = "tak")
###tutaj kończą się automatyczne podmiotowe
bn_ok <- bn_ok %>%
  full_join(.,IOK_podm,by = "id") %>%
  mutate(czy_automatycznie = ifelse(!is.na(automatyczna_podmiotowa),"podmiotowa","nie")) %>%
  select(-automatyczna_podmiotowa) %>%
  mutate(czy_automatycznie = ifelse(czy_automatycznie=="podmiotowa"&rodzaj_ksiazki!="podmiotowa","nie",as.character(czy_automatycznie)))

###czy i jak automatyzować przedmiotową?

#write.csv2(bn_ok, "C:/Users/Cezary/Desktop/bn_ok_2009.csv", row.names = F, na = '', fileEncoding = 'UTF-8')
chunk6 <- bn_ok
bn_ok <- chunk6
Komunikaty ostrzegawcze:
1: Unknown or uninitialised column: 'drugi_autor'. 
2: Unknown or uninitialised column: 'drugi_autor'. 
3: Unknown or uninitialised column: 'drugi_autor'. 
4: Unknown or uninitialised column: 'drugi_autor'. 
5: Unknown or uninitialised column: 'drugi_autor'. 
6: Unknown or uninitialised column: 'drugi_autor'. 
#propozycja1
#na później kierowane są wszystkie książki przedmiotowe, które mają bez_ukd_PBL lub ukd_pogranicze i nie są biblią oraz książki wydane poza Polską, które nie poszły do automatycznego importu
na_pozniej <- bn_ok %>%
  filter((if (X501=="") !grepl("pl",substr(X008,16,18))&!grepl("pol",substr(X008,36,38))&czy_automatycznie=="nie")|czy_automatycznie=="nie"&rodzaj_ksiazki=="przedmiotowa"&dziedzina_PBL %in% c("bez_ukd_PBL","ukd_pogranicze")&(czy_biblia!="tak"|is.na(czy_biblia))|grepl("arleq",X260,ignore.case = TRUE)&czy_automatycznie=="nie")
warunek posiada d戼㸳ugo㤼㹣攼㸶 > 1 i tylko pierwszy element b攼㹡dzie u戼㹦yty
#bezpiecznik

#propozycja2
#propozycja, by kierować na później wszystkie książki przedmiotowe z dziedziny "bez_ukd_PBL"
# na_pozniej <- bn_ok %>%
#   filter(czy_automatycznie=="nie"&rodzaj_ksiazki=="przedmiotowa"&dziedzina_PBL=="bez_ukd_PBL"&(czy_biblia!="tak"|is.na(czy_biblia)))

# #propozycja3
# na_pozniej <- bn_ok %>%
#   filter(czy_automatycznie=="nie"&rodzaj_ksiazki=="przedmiotowa"&dziedzina_PBL %in% c("bez_ukd_PBL","ukd_pogranicze")&(czy_biblia!="tak"|is.na(czy_biblia)))

#propozycja4
#stara operacja
# na_pozniej <- bn_ok %>%
#   filter(czy_automatycznie=="nie"&rodzaj_ksiazki=="przedmiotowa"&dziedzina_PBL=="bez_ukd_PBL") %>%
#   mutate(kategorie_literackie = ifelse(grepl("mitolog|baś|bajk|poezj|liryk|epik|dramat|literac|literat|pisar|wiersz|proz|powieś|opowiad|miniatur|aforyzm|esej|szkic|feliet|report|dzienni|wspomnie|autobiograf|kaza|rozmyśl|list|interpretacj",X650,ignore.case = TRUE)|grepl("mitolog|baś|bajk|poezj|liryk|epik|dramat|literac|literat|pisar|wiersz|proz|powieś|opowiad|miniatur|aforyzm|esej|szkic|feliet|report|dzienni|wspomnie|autobiograf|kaza|rozmyśl|list|interpretacj",X655, ignore.case = TRUE),"tak","nie")) %>%
#   filter(kategorie_literackie=="nie") %>%
#   mutate(lata = ifelse(grepl("\\d{2}-",X100),str_replace(X100,"(.*\\$d\\(.*?)(\\d{2,4})(\\?{0,1}-.*)","\\2"),NA),
#          lata_temat = ifelse(grepl("\\d{2}-",X600),str_replace(X600,"(.*\\$d\\(.*?)(\\d{2,4})(\\?{0,1}-.*)","\\2"),NA)) %>%
# filter((is.na(lata)&is.na(lata_temat))|!(as.integer(lata)<1800)|!(as.integer(lata_temat)<1800))
#aktualizacja - wpisz właściwy rok w ścieżkę pliku
write.csv2(na_pozniej, "C:/Users/Cezary/Desktop/bn_2011_ks_na_pozniej.csv", row.names = F, na = '', fileEncoding = 'UTF-8')

bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from na_pozniej b)")
chunk7 <- bn_ok

Czy jest sens to robić?

###automatycznie działowanie przedmiotowej na podstawie dotychczasowych importów
#zapisy <- RJDBC::dbGetQuery(PBL,
#                            "select z.za_zapis_id, dz.dz_dzial_id, dz.dz_nazwa, z.za_status_imp, z.za_uwagi
#                            from pbl_zapisy z
#                            join pbl_dzialy dz on dz.dz_dzial_id=z.za_dz_dzial1_id
#                            where z.za_uwagi like '%import%'") %>%
#  mutate(pracownik_pbl = str_extract(ZA_UWAGI, "(?<=akceptuje:)([A-Z]*)")) %>%
#  select(-ZA_UWAGI)
#
#poprzednie_importy <- rbind(listy_2004,listy_2005,listy_2006,listy_2007,listy_2008) %>%
#  full_join(.,zapisy,by = "ZA_ZAPIS_ID") %>%
#  select(X650,X655,DZ_DZIAL_ID,DZ_NAZWA,ZA_STATUS_IMP) %>%
#  mutate(X650 = str_remove_all(X650,"\\\\7"),
#         X655 = str_remove_all(X655,"\\\\7"),
#         X650 = str_remove_all(str_replace_all(X650,"(\\$a)","\\\\#7\\1"),"#"),
#         X655 = str_remove_all(str_replace_all(X655,"(\\$a)","\\\\#7\\1"),"#")) %>%
#  group_by_at(vars(X650:DZ_NAZWA)) %>%
#  mutate(ZA_STATUS_IMP = paste(ZA_STATUS_IMP,collapse = "|")) %>%
#  ungroup() %>%
#  unique() %>%
#  ungroup() %>%
#  filter(!grepl("\\|",DZ_DZIAL_ID)) %>%
#  filter(grepl("IOK",ZA_STATUS_IMP)) %>%
#  filter(!grepl("INO|IMP|IPN|IPC",ZA_STATUS_IMP)) %>%
#  filter(!grepl("osobowe",DZ_NAZWA)) %>%
#  filter(!(is.na(X650)&is.na(X655))) %>%
#  mutate(ile650 = str_count(X650,"\\|")+1,
#         ile655 = str_count(X655,"\\|")+1) %>%
#  filter(ile650<=10|ile655<=10) %>%
#  select(-ile650,-ile655) %>%
#  mutate(ile_statusow = str_count(ZA_STATUS_IMP,"\\|")+1) %>%
#  arrange(X655,X650,-ile_statusow)
#poprzednie_importy$id_grupy <- cumsum(!duplicated(poprzednie_importy[1:2]))
#poprzednie_importy <- poprzednie_importy[!duplicated(poprzednie_importy$id_grupy),] %>%
#  mutate(id = row_number()) %>%
#  select(-ile_statusow,-id_grupy)
#
#do_dzialowania <- data.frame(id = as.integer(), X650 = as.character(), X655 = as.character(), stringsAsFactors = FALSE)
#x <- 1:length(poprzednie_importy$id)
#for (i in x){
#  progress(match(i,x), max.value = length(x)) 
#    if (is.na(poprzednie_importy$X650[i])&!is.na(poprzednie_importy$X655[i])){
#      permutations <- as.data.frame(permutations(unlist(str_split(poprzednie_importy$X655[i],"\\|")), str_count(poprzednie_importy$X655[i],"\\|")+1)) %>%
#        unite(data=.,col = "permutation", sep = "|") %>%
#        mutate(X650 = NA,
#               X655 = permutation,
#               id = poprzednie_importy$id[i]) %>%
#        select(id,X650,X655)
#      do_dzialowania <- rbind(do_dzialowania,permutations)
#    } else if (is.na(poprzednie_importy$X655[i])&!is.na(poprzednie_importy$X650[i])){
#      permutations <- as.data.frame(permutations(unlist(str_split(poprzednie_importy$X650[i],"\\|")), str_count(poprzednie_importy$X650[i],"\\|")+1)) %>%
#        unite(data=.,col = "permutation", sep = "|") %>%
#        mutate(X650 = permutation,
#               X655 = NA,
#               id = poprzednie_importy$id[i]) %>%
#        select(id,X650,X655)
#      do_dzialowania <- rbind(do_dzialowania,permutations)
#    } else {
#      permutations <- as.data.frame(permutations(unlist(str_split(poprzednie_importy$X650[i],"\\|")), str_count(poprzednie_importy$X650[i],"\\|")+1)) %>%
#        unite(data=.,col = "permutation", sep = "|") %>%
#        mutate(X650 = permutation,
#               id = poprzednie_importy$id[i]) %>%
#        select(id,X650)
#      permutations650 <- data.frame(stringsAsFactors = FALSE)
#      permutations650 <- rbind(permutations650,permutations)
#      permutations <- as.data.frame(permutations(unlist(str_split(poprzednie_importy$X655[i],"\\|")), str_count(poprzednie_importy$X655[i],"\\|")+1)) %>%
#        unite(data=.,col = "permutation", sep = "|") %>%
#        mutate(X655 = permutation,
#               id = poprzednie_importy$id[i]) %>%
#        select(id,X655)
#      permutations655 <- data.frame(stringsAsFactors = FALSE)
#      permutations655 <- rbind(permutations655,permutations)
#      permutations <- merge(permutations650,permutations655,by = "id",all = TRUE) %>%
#        select(id,X650,X655)
#      do_dzialowania <- rbind(do_dzialowania,permutations)
#    }
#}
#
#do_dzialowania <- do_dzialowania %>%
#  full_join(.,poprzednie_importy %>% select(id,DZ_DZIAL_ID,DZ_NAZWA),by = "id") %>%
#  select(-id)
#do_dzialowania[is.na(do_dzialowania)] <- ""
#####tutaj sprawdzić
#do_dzialowania_przedm <- merge(bn_ok %>% filter(czy_automatycznie=="nie"&rodzaj_ksiazki=="przedmiotowa"),do_dzialowania, by = c("X650","X655")) %>%
#  select(id,DZ_DZIAL_ID,DZ_NAZWA)
#wczytanie kartotek PBL
redaktorzy_dzialow <- sheets_read(ss = "1Baje-ZfPgAKEDAoDzeo_eCBDrsL7jAXt6ubP2cedbFc", sheet = "redaktorzy_działów") %>%
  select(DZ_DZIAL_ID, DZ_NAZWA, redaktor_dzialu) #%>%
  #mutate(DZ_DZIAL_ID = as.character(DZ_DZIAL_ID))

PBL_dzialy <- dbReadTable(PBL,'PBL_DZIALY') %>%
  select(1,3,6)

PBL_dzialy_path <- merge(x = PBL_dzialy, y = PBL_dzialy, by.x = "DZ_DZ_DZIAL_ID", by.y = "DZ_DZIAL_ID", all.x = TRUE)
colnames(PBL_dzialy_path) <- c("NAD_DZ_DZIAL_ID", "DZ_DZIAL_ID", "DZ_NAZWA", "NAD_DZ_NAZWA", "NAD_NAD_DZ_DZIAL_ID")

PBL_dzialy_path <- merge(x = PBL_dzialy_path, y = PBL_dzialy, by.x = "NAD_NAD_DZ_DZIAL_ID", by.y = "DZ_DZIAL_ID", all.x = TRUE)
colnames(PBL_dzialy_path) <- c("NAD_NAD_DZ_DZIAL_ID", "NAD_DZ_DZIAL_ID", "DZ_DZIAL_ID", "DZ_NAZWA", "NAD_DZ_NAZWA", "NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_DZ_DZIAL_ID")

PBL_dzialy_path <- merge(x = PBL_dzialy_path, y = PBL_dzialy, by.x = "NAD_NAD_NAD_DZ_DZIAL_ID", by.y = "DZ_DZIAL_ID", all.x = TRUE)
colnames(PBL_dzialy_path) <- c("NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_DZ_DZIAL_ID", "NAD_DZ_DZIAL_ID", "DZ_DZIAL_ID", "DZ_NAZWA", "NAD_DZ_NAZWA", "NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_DZ_DZIAL_ID")

PBL_dzialy_path <- merge(x = PBL_dzialy_path, y = PBL_dzialy, by.x = "NAD_NAD_NAD_NAD_DZ_DZIAL_ID", by.y = "DZ_DZIAL_ID", all.x = TRUE)
colnames(PBL_dzialy_path) <- c("NAD_NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_DZ_DZIAL_ID", "NAD_DZ_DZIAL_ID", "DZ_DZIAL_ID", "DZ_NAZWA", "NAD_DZ_NAZWA", "NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_NAD_DZ_DZIAL_ID")

PBL_dzialy_path <- merge(x = PBL_dzialy_path, y = PBL_dzialy, by.x = "NAD_NAD_NAD_NAD_NAD_DZ_DZIAL_ID", by.y = "DZ_DZIAL_ID", all.x = TRUE)
colnames(PBL_dzialy_path) <- c("NAD_NAD_NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_DZ_DZIAL_ID", "NAD_DZ_DZIAL_ID", "DZ_DZIAL_ID", "DZ_NAZWA", "NAD_DZ_NAZWA", "NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_NAD_NAD_DZ_DZIAL_ID")

PBL_dzialy_path <- PBL_dzialy_path %>%
  select(-length(PBL_dzialy_path)) %>%
  filter(DZ_DZIAL_ID!=0) %>%
  select(6,7,5,8,4,9,3,10,2,11,1,12) %>%
  unique()

PBL_dz_osob <- PBL_dzialy_path %>%
  filter(grepl("osobowe", DZ_NAZWA)|grepl("osobowe", NAD_DZ_NAZWA)|grepl("osobowe", NAD_NAD_DZ_NAZWA)|grepl("osobowe", NAD_NAD_NAD_DZ_NAZWA)|grepl("osobowe", NAD_NAD_NAD_NAD_DZ_NAZWA)|grepl("osobowe", NAD_NAD_NAD_NAD_NAD_DZ_NAZWA)) %>%
  select(1,2,3,4,5,6,7,8) %>%
  filter(DZ_DZIAL_ID!=148)

PBL_dz_osob_1 <- PBL_dz_osob %>%
  select(1,2,3,4)
PBL_dz_osob_2 <- PBL_dz_osob %>%
  select(1,2,5,6)
PBL_dz_osob_3 <- PBL_dz_osob %>%
  select(1,2,7,8)
colnames(PBL_dz_osob_2) <- c(names(PBL_dz_osob_1))
colnames(PBL_dz_osob_3) <- c(names(PBL_dz_osob_1))
PBL_dz_osob <- rbind(PBL_dz_osob_1,PBL_dz_osob_2,PBL_dz_osob_3) %>%
  filter(!is.na(NAD_DZ_DZIAL_ID)) %>%
  unique()
PBL_dz_osob <- rbind(PBL_dz_osob, c("15043", "Hasła osobowe(luksemburska)","15043", "Hasła osobowe(luksemburska)"), c("430", "Hasła osobowe (Ludzie teatru i filmu)","430", "Hasła osobowe (Ludzie teatru i filmu)"))
PBL_dz_osob_bez_teatru <- PBL_dz_osob %>%
  filter(DZ_DZIAL_ID!=430)

PBL_tworcy <- dbReadTable(PBL,'PBL_TWORCY')
tw_i_dz_podm <- merge(x=PBL_tworcy,y=PBL_dz_osob_bez_teatru, by.x = "TW_DZ_DZIAL_ID", by.y = "NAD_DZ_DZIAL_ID", all.x = TRUE) %>%
  arrange(TW_TWORCA_ID)

tw_i_dz_podm <- data.frame(tw_i_dz_podm, pol_osob = ifelse(tw_i_dz_podm$TW_DZ_DZIAL_ID == 148 & substr(tw_i_dz_podm$TW_NAZWISKO,1,1)==str_sub(tw_i_dz_podm$DZ_NAZWA,nchar(as.character(tw_i_dz_podm$DZ_NAZWA)),nchar(as.character(tw_i_dz_podm$DZ_NAZWA))),TRUE,FALSE), pol = ifelse(tw_i_dz_podm$TW_DZ_DZIAL_ID == 148, TRUE, FALSE)) %>%
  filter(pol_osob == TRUE | pol == FALSE)
PBL_tworcy_podm <- tw_i_dz_podm %>%
  select(TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, TW_NAZW_WLASCIWE, TW_PSEUDONIMY, TW_DATA_URODZIN, TW_DATA_ZGONU, TW_ROCZNIKI_PBL, TW_SLOWA_KLUCZOWE, TW_UWAGI, TW_ROK_URODZIN, TW_ROK_ZGONU, TW_LICZBA_ZAPISOW, TW_ADNOTACJE, TW_TRANSLITERACJE) %>%
  filter(!is.na(DZ_DZIAL_ID))
colnames(PBL_tworcy_podm) <- c("TW_TWORCA_ID", "TW_NAZWISKO", "TW_IMIE", "TW_DZ_DZIAL_ID", "DZ_NAZWA", "TW_NAZW_WLASCIWE", "TW_PSEUDONIMY", "TW_DATA_URODZIN", "TW_DATA_ZGONU", "TW_ROCZNIKI_PBL", "TW_SLOWA_KLUCZOWE", "TW_UWAGI", "TW_ROK_URODZIN", "TW_ROK_ZGONU", "TW_LICZBA_ZAPISOW", "TW_ADNOTACJE", "TW_TRANSLITERACJE")
PBL_tworcy_podm <- PBL_tworcy_podm %>%
  mutate(nazwa = ifelse(is.na(TW_IMIE),as.character(TW_NAZWISKO),paste(TW_NAZWISKO,TW_IMIE, sep = "")),
         nazwa = str_to_lower(str_replace_all(nazwa, "\\W", "")),
         nazwa = str_replace_all(str_to_lower(nazwa), "\\W", ""))

tw_i_dz <- merge(x=PBL_tworcy,y=PBL_dz_osob, by.x = "TW_DZ_DZIAL_ID", by.y = "NAD_DZ_DZIAL_ID", all.x = TRUE) %>%
  arrange(TW_TWORCA_ID)
tw_i_dz <- data.frame(tw_i_dz, pol_osob = ifelse(tw_i_dz$TW_DZ_DZIAL_ID == 148 & substr(tw_i_dz$TW_NAZWISKO,1,1)==str_sub(tw_i_dz$DZ_NAZWA,nchar(as.character(tw_i_dz$DZ_NAZWA)),nchar(as.character(tw_i_dz$DZ_NAZWA))),TRUE,FALSE), pol = ifelse(tw_i_dz$TW_DZ_DZIAL_ID == 148, TRUE, FALSE)) %>%
  filter(pol_osob == TRUE | pol == FALSE)
PBL_tworcy <- tw_i_dz %>%
  select(TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, TW_NAZW_WLASCIWE, TW_PSEUDONIMY, TW_DATA_URODZIN, TW_DATA_ZGONU, TW_ROCZNIKI_PBL, TW_SLOWA_KLUCZOWE, TW_UWAGI, TW_ROK_URODZIN, TW_ROK_ZGONU, TW_LICZBA_ZAPISOW, TW_ADNOTACJE, TW_TRANSLITERACJE)
colnames(PBL_tworcy) <- c("TW_TWORCA_ID", "TW_NAZWISKO", "TW_IMIE", "TW_DZ_DZIAL_ID", "DZ_NAZWA", "TW_NAZW_WLASCIWE", "TW_PSEUDONIMY", "TW_DATA_URODZIN", "TW_DATA_ZGONU", "TW_ROCZNIKI_PBL", "TW_SLOWA_KLUCZOWE", "TW_UWAGI", "TW_ROK_URODZIN", "TW_ROK_ZGONU", "TW_LICZBA_ZAPISOW", "TW_ADNOTACJE", "TW_TRANSLITERACJE")
PBL_tworcy <- PBL_tworcy %>%
  mutate(nazwa = ifelse(is.na(TW_IMIE),as.character(TW_NAZWISKO),paste(TW_NAZWISKO,TW_IMIE, sep = "")),
         nazwa = str_to_lower(str_replace_all(nazwa, "\\W", "")),
         nazwa = str_replace_all(str_to_lower(nazwa), "\\W", ""),
         TW_DZ_DZIAL_ID = as.numeric(TW_DZ_DZIAL_ID))

PBL_autorzy <- dbReadTable(PBL,'PBL_AUTORZY') %>%
  mutate(nazwa = ifelse(is.na(AM_IMIE),as.character(AM_NAZWISKO),paste(AM_NAZWISKO,AM_IMIE, sep = "")),
         nazwa = str_to_lower(str_replace_all(nazwa, "\\W", "")),
         nazwa = str_replace_all(str_to_lower(nazwa), "\\W", "")) %>%
  filter(nazwa != "nana")

PBL_wspoltworcy <- dbReadTable(PBL,'PBL_OSOBY') %>%
  mutate(nazwa_prosta = str_replace_all(str_to_lower(ifelse(is.na(OS_IMIE),as.character(OS_NAZWISKO),paste(OS_NAZWISKO,OS_IMIE, sep = ""))), "\\W", "")) %>%
  filter(nazwa_prosta !="nana")

PBL_funkcje <- sheets_read(ss = "1htn_L6REs3GdG1xSiGHIfr6MJvjmmU_kVGxiMZtCV24", sheet = "Arkusz1")

PBL_wydawnictwa <- dbReadTable(PBL,'PBL_WYDAWNICTWA') %>%
  mutate(nazwa_prosta = str_replace_all(str_to_lower(paste(WY_MIASTO, WY_NAZWA)), "\\W", "")) %>%
  filter(nazwa_prosta !="nana")

PBL_rodzaje_zapisow <- dbReadTable(PBL,'PBL_RODZAJE_ZAPISOW')

BN_PBL_lista_literatur <- sheets_read(ss = "1zbwjnrtWGvbjrQTLMavJcWSu7HfP0I-USNgZ_KWiXjc", sheet = "lista ukd bn") %>%
  filter(!is.na(ukd_ogolne)) %>%
  select(3:9) %>%
  cSplit(.,c("pbl_id","pbl_nazwa","redaktor_dzialu","pbl_id_literatury","pbl_literatura"),sep = "|",direction = "long") %>%
  filter(!is.na(pbl_id))

PBL_hasla_osobowe <- sheets_read(ss = "1zbwjnrtWGvbjrQTLMavJcWSu7HfP0I-USNgZ_KWiXjc", sheet = "pbl_hasla_osobowe") %>%
  select(2:5)
colnames(PBL_hasla_osobowe) <- c("DZ_DZIAL_ID","DZ_NAZWA","redaktor_dzialu","nazwa")
bn_ok <- chunk7
# podzielenie unikatowych rekordów bn na dwa wiersze w tabeli, z których powstaną dwa rekordy pbl
bn_ok <- bn_ok %>%
  mutate(ZA_UWAGI = 1:nrow(.))

wspolwydania_fix <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie") %>%
  mutate(X245 = ifelse(grepl("\\]\\.[^$]",X245),str_replace(X245,"(\\$c)(.*)(\\]\\. )(.* \\/ .*)","\\1\\2]|10$a\\4"),str_replace(X245,"(\\$c)(.*?)(?<!tł|red)(\\. )(.* \\/ .*)","\\1\\2|10$a\\4")),
         X245 = str_replace_all(X245, "\\/[^\\$]", "/$c"))

# usunięcie ze zbioru współwydawnictw (będą później połączone)
bn_ok <- bn_ok %>% 
  filter(id %notin% wspolwydania_fix$id)

# usunięcie z pola X246 wersji tytułów, które nie są tytułami oryginału
marc_field_246 <- wspolwydania_fix %>%
  select(ZA_UWAGI,X246)%>%
  mutate(X246=str_replace_all(X246,"(^|\\|)","~\\1"),
         X246 = ifelse(X246=="~",as.character(X246),str_remove(X246,"^~"))) %>%
  cSplit(.,"X246",sep = "~",direction = "long") %>%
  mutate(X246=str_remove_all(X246,"^\\|")) %>%
  mutate(indicator = str_replace_all(X246,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(wspolwydania_fix$X246,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_246)[1]))
colnames(empty_table) <-subfield_list
marc_field_246<-cbind(marc_field_246,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_246$X246 <- str_replace(marc_field_246$X246,subfield_list_char[i],"|\\1")
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_246[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_246$X246),str_replace_all(gsub(string,"\\3",marc_field_246$X246),"\\${2}.", "~"),NA)
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
marc_field_246 <- marc_field_246[, colSums(is.na(marc_field_246)) != nrow(marc_field_246)]
marc_field_246 <- marc_field_246 %>% 
  filter(is.na(`$i`)|`$i`!="Tyt. przekł.:") %>% 
  select(ZA_UWAGI,X246) %>% 
  mutate(X246 = str_remove_all(X246,"\\|")) %>% 
  group_by(ZA_UWAGI) %>% 
  mutate(X246 = paste(X246,collapse = "|")) %>% 
  ungroup() %>% 
  unique()

wspolwydania_fix$X246 <- marc_field_246$X246

# podział na dwa rekordy
wspolwydania_fix <- wspolwydania_fix %>%
  cSplit(c("X245", "X246"), sep = "|", direction = "long") %>% 
  filter(!is.na(X245))

# zmiana pola ZA_UWAGI na wartość unikatową
wspolwydania_fix %$%  
    { ZA_UWAGI==lag(ZA_UWAGI,)} %>% 
    as.numeric() %>% 
    {.} -> wspolwydania_fix$same
wspolwydania_fix$same[1] <- 0
wspolwydania_fix <- wspolwydania_fix %>% 
  mutate(ZA_UWAGI = ifelse(same == 0, paste(rok,sprintf("%05d", as.integer(ZA_UWAGI)), "0", sep = ""), paste(rok,sprintf("%05d", as.integer(ZA_UWAGI)), "1", sep = ""))) %>% 
  select(-same)

# połączenie zbiorów
bn_ok <- bn_ok %>% 
  mutate(ZA_UWAGI = paste(rok,sprintf("%05d", as.integer(ZA_UWAGI)),sep = "")) %>% 
  bind_rows(wspolwydania_fix)
binding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vector
chunk10 <- bn_ok
bn_ok <- chunk10
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa")
###przypisanie redaktora na podstawie osoby z 600 jako tematu - książki o twórcy
#600
marc_field_600 <- przedmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X600)%>%
  filter(X600!="") %>%
  mutate(X600=str_replace_all(X600,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X600",sep = "~",direction = "long") %>%
  filter(X600!="") %>%
  mutate(X600=str_remove_all(X600,"^\\|")) %>%
  mutate(indicator = str_replace_all(X600,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(przedmiotowa_redaktorzy$X600,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_600)[1]))
colnames(empty_table) <-subfield_list
marc_field_600<-cbind(marc_field_600,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_600$X600 <- str_replace(marc_field_600$X600,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_600[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_600$X600),str_replace_all(gsub(string,"\\3",marc_field_600$X600),"\\${2}.", "~"),NA)
}
marc_field_600 <- marc_field_600 %>%
  select(ZA_UWAGI,`$a`,`$d`,`$c`) %>%
  mutate(name = ifelse(!is.na(`$c`)&substr(`$c`,nchar(`$c`),nchar(`$c`))==";",paste(`$a`,`$c`,`$d`,sep = " "),ifelse(!is.na(`$d`),paste(`$a`,`$d`,sep = " "),as.character(`$a`)))) %>%
  select(ZA_UWAGI,name) %>%
  mutate(name = str_replace(name,"(\\))(\\.$)","\\1"),
         name = str_replace(name, "([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)","\\1"))

marc_field_600 <- marc_field_600 %>%
  unique() %>%
  inner_join(.,pbl_viaf,by = c("name" = "BN_name")) %>%
  left_join(.,PBL_tworcy,by = c("pbl_id"="TW_TWORCA_ID")) %>%
  left_join(.,redaktorzy_dzialow,by = c("TW_DZ_DZIAL_ID"="DZ_DZIAL_ID")) %>%
  select(ZA_UWAGI,TW_TWORCA_ID=pbl_id,TW_NAZWISKO,TW_IMIE,TW_DZ_DZIAL_ID,DZ_NAZWA=DZ_NAZWA.x,redaktor_dzialu)
count <- as.data.frame(table(marc_field_600$ZA_UWAGI))
marc_field_600 <- merge(marc_field_600,count,by.x = "ZA_UWAGI", by.y = "Var1") %>%
  filter(Freq<2) %>%
  select(-Freq) %>%
  rename(DZ_DZIAL_ID=TW_DZ_DZIAL_ID) %>%
  mutate(RZ_RODZAJ_ID = 2,
         RZ_NAZWA = "książka o twórcy (przedmiotowa)")

###przypisanie do redaktorów na podstawie literatury z pola 655
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  filter(ZA_UWAGI %notin% marc_field_600$ZA_UWAGI)

#655
marc_field_655 <- przedmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X655)%>%
  filter(X655!="") %>%
  mutate(X655=str_replace_all(X655,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X655",sep = "~",direction = "long") %>%
  filter(X655!="") %>%
  mutate(X655=str_remove_all(X655,"^\\|")) %>%
  mutate(indicator = str_replace_all(X655,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(przedmiotowa_redaktorzy$X655,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_655)[1]))
colnames(empty_table) <-subfield_list
marc_field_655<-cbind(marc_field_655,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_655$X655 <- str_replace(marc_field_655$X655,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_655[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_655$X655),str_replace_all(gsub(string,"\\3",marc_field_655$X655),"\\${2}.", "~"),NA)
}

marc_field_655 <- marc_field_655 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

PBL_literatury_obce <- PBL_dzialy_path %>%
  filter(NAD_DZ_DZIAL_ID==30) %>%
  select(1,2) %>%
  left_join(.,redaktorzy_dzialow,by = "DZ_DZIAL_ID") %>%
  filter(!is.na(redaktor_dzialu)) %>%
  select(1,DZ_NAZWA = 2,4) %>%
  mutate(nazwa = substr(str_replace(DZ_NAZWA, "(.*?)( )(.*?)","\\3"),1,nchar(str_replace(DZ_NAZWA, "(.*?)( )(.*?)","\\3"))-1),
         nazwa = ifelse(nazwa=="romska (cygańska","romsk|cygańsk",as.character(nazwa)))

reczne <- data.frame(DZ_DZIAL_ID = c(32,32,32,32,59,86,107,149,67,69,34,34,34,34,34,55,32,99,34),DZ_NAZWA = c("Literatura brytyjska i irlandzka","Literatura brytyjska i irlandzka","Literatura brytyjska i irlandzka","Literatura brytyjska i irlandzka","Literatura grecka starożytna","Literatura łacińska średniowieczna","Literatura syryjska","Literatura esperanto","Literatura holenderska","Literatury Indii","Literatury Afryki Subsaharyjskiej","Literatury Afryki Subsaharyjskiej","Literatury Afryki Subsaharyjskiej","Literatury Afryki Subsaharyjskiej","Literatury Afryki Subsaharyjskiej", "Literatura egipsko-arabska", "Literatura brytyjska i irlandzka","Literatura palestyńsko-arabska","Literatury Afryki Subsaharyjskiej"), redaktor_dzialu = c("BEATAK","BEATAK","BEATAK","BEATAK","BEATAS","BEATAS","BEATAD","Cezary","TOMASZU","EWA","EWA","EWA","EWA","EWA","EWA","BEATAD","BEATAK","BEATAD","EWA"), nazwa = c("angielsk","szkock","irlandzk","walijsk","greck","łacińsk","syryjsk","esperanck","niderlandzk","indyjsk","południowoafryka","senegalsk","nigeryjsk","afrykańsk","ruandyjsk","egipsk. nowożytn","celtyck","palestyńsk","somalijsk"))

PBL_literatury_obce <- rbind(PBL_literatury_obce,reczne)

marc_field_655 <- sqldf("select *
                            from marc_field_655 a
                            left join PBL_literatury_obce b on a.`$a` like ('%'||b.nazwa||'%')") %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_655$same <- cumsum(!duplicated(marc_field_655[1]))
marc_field_655 <- marc_field_655[!duplicated(marc_field_655$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(marc_field_600))
###przypisanie do redaktorów na podstawie literatury z pola 650
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  filter(ZA_UWAGI %notin% marc_field_600$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% marc_field_655$ZA_UWAGI)

#650
marc_field_650 <- przedmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X650)%>%
  filter(X650!="") %>%
  mutate(X650=str_replace_all(X650,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X650",sep = "~",direction = "long") %>%
  filter(X650!="") %>%
  mutate(X650=str_remove_all(X650,"^\\|")) %>%
  mutate(indicator = str_replace_all(X650,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(przedmiotowa_redaktorzy$X650,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_650)[1]))
colnames(empty_table) <-subfield_list
marc_field_650<-cbind(marc_field_650,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_650$X650 <- str_replace(marc_field_650$X650,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_650[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_650$X650),str_replace_all(gsub(string,"\\3",marc_field_650$X650),"\\${2}.", "~"),NA)
}

marc_field_650 <- marc_field_650 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_650 <- sqldf("select *
                            from marc_field_650 a
                            left join PBL_literatury_obce b on a.`$a` like ('%'||b.nazwa||'%')") %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_650$same <- cumsum(!duplicated(marc_field_650[1]))
marc_field_650 <- marc_field_650[!duplicated(marc_field_650$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(marc_field_600))

do_przedmiotowej1 <- rbind(marc_field_600,marc_field_655,marc_field_650)

#przypisanie na podstawie deskryptorów tematycznych z 650 i 655
zapisy <- RJDBC::dbGetQuery(PBL,
                            "select z.za_zapis_id, dz.dz_dzial_id, dz.dz_nazwa, rz.rz_rodzaj_id, rz.rz_nazwa, z.za_status_imp, z.za_uwagi
                            from pbl_zapisy z
                            join pbl_dzialy dz on dz.dz_dzial_id=z.za_dz_dzial1_id
                            join pbl_rodzaje_zapisow rz on rz.rz_rodzaj_id=z.za_rz_rodzaj1_id
                            where z.za_uwagi like '%import%'") %>%
  mutate(pracownik_pbl = str_extract(ZA_UWAGI, "(?<=akceptuje:)([A-Z]*)")) %>%
  select(-ZA_UWAGI)
nazwy_lit_obcych <- str_replace_all(paste(PBL_literatury_obce$nazwa,collapse = "|"),"\\(","\\\\(")
#aktualizacja - dodaj do skryptu listę z ostatnim brakującym zaimportowanym rocznikiem
poprzednie_importy <- rbind(listy_2004,listy_2005,listy_2006,listy_2007,listy_2008, listy_2009, listy_2010) %>%
  full_join(.,zapisy,by = "ZA_ZAPIS_ID") %>%
  select(ZA_ZAPIS_ID,X650,X655,DZ_DZIAL_ID,DZ_NAZWA,RZ_RODZAJ_ID,RZ_NAZWA,pracownik_pbl,ZA_STATUS_IMP) %>%
  mutate(X650 = str_remove_all(X650,"\\\\7"),
         X655 = str_remove_all(X655,"\\\\7"),
         X650 = str_remove_all(str_replace_all(X650,"(\\$a)","\\\\#7\\1"),"#"),
         X655 = str_remove_all(str_replace_all(X655,"(\\$a)","\\\\#7\\1"),"#")) %>%
  unique() %>%
  filter(RZ_RODZAJ_ID %notin% c(0,1,2,250,764)) %>%
  arrange(pracownik_pbl,DZ_DZIAL_ID) %>%
  filter(!grepl(nazwy_lit_obcych,X650)&!grepl(nazwy_lit_obcych,X655)) %>%
  filter(!is.na(pracownik_pbl)) %>%
  filter(ZA_STATUS_IMP %in% c("IOK","IPC"))

#przypisanie na podstawie częstotliwości deskryptorów 655
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  filter(ZA_UWAGI %notin% do_przedmiotowej1$ZA_UWAGI)

deskryptory655 <- poprzednie_importy %>%
  select(X655,pracownik_pbl,DZ_DZIAL_ID,DZ_NAZWA) %>%
  filter(!is.na(X655)) %>%
  unite(data=.,col = "deskryptor655", sep = "~")

deskryptory655 <- as.data.frame(table(deskryptory655$deskryptor655)) %>%
  cSplit(.,"Var1",sep = "~",direction = "wide") %>%
  rename(X655 = Var1_1,
         redaktor_dzialu = Var1_2,
         DZ_DZIAL_ID = Var1_3,
         DZ_NAZWA = Var1_4) %>%
  mutate(X655 = str_remove_all(X655,"\\\\7\\$a"),
         X655 = str_remove_all(X655,"\\$2DBN"),
         X655 = str_replace_all(X655,"\\$.|\\|"," "),
         X655 = str_replace_all(X655," ",".*"),
         X655 = str_replace_all(X655, "[^\\p{L}\\d\\*\\.\\-\\s]", "")) %>%
  arrange(X655,-Freq,DZ_NAZWA)

deskryptory655$id_grupy <- cumsum(!duplicated(deskryptory655[2]))
deskryptory655 <- deskryptory655[!duplicated(deskryptory655$id_grupy),] %>%
  select(-id_grupy) %>%
  arrange(-Freq)

x <- 1:length(deskryptory655$X655)
test <- data.frame(stringsAsFactors = FALSE)

for (i in x) {
  progress(match(i,x), max.value = length(x))
    do_przedmiotowej2 <- przedmiotowa_redaktorzy %>%
      mutate(redaktor_dzialu = ifelse(grepl(deskryptory655$X655[i],X655),as.character(deskryptory655$redaktor_dzialu)[i],NA),
             ile = ifelse(grepl(deskryptory655$X655[i],X655),as.integer(deskryptory655$Freq)[i],NA),
             co = ifelse(grepl(deskryptory655$X655[i],X655),as.character(deskryptory655$X655)[i],NA),
             DZ_DZIAL_ID = ifelse(grepl(deskryptory655$X655[i],X655),as.integer(deskryptory655$DZ_DZIAL_ID)[i],NA),
             DZ_NAZWA = ifelse(grepl(deskryptory655$X655[i],X655),as.character(deskryptory655$DZ_NAZWA)[i],NA)) %>%
      filter(!is.na(redaktor_dzialu))
    if (length(do_przedmiotowej2$redaktor_dzialu)>0) {
      test <- rbind(test,do_przedmiotowej2)
    } else {}
    
}
count <- as.data.frame(table(test$ZA_UWAGI))
do_przedmiotowej2 <- merge(test,count, by.x = "ZA_UWAGI",by.y = "Var1") %>%
  mutate(dlugosc = nchar(co)) %>%
  arrange(-Freq,ZA_UWAGI,-dlugosc,-ile)

do_przedmiotowej2$id_grupy <- cumsum(!duplicated(do_przedmiotowej2[1]))
do_przedmiotowej2 <- do_przedmiotowej2[!duplicated(do_przedmiotowej2$id_grupy),] %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(do_przedmiotowej1))
#przypisanie na podstawie częstotliwości deskryptorów 650
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  filter(ZA_UWAGI %notin% do_przedmiotowej1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_przedmiotowej2$ZA_UWAGI)

deskryptory650 <- poprzednie_importy %>%
  select(X650,pracownik_pbl,DZ_DZIAL_ID,DZ_NAZWA) %>%
  filter(!is.na(X650)) %>%
  unite(data=.,col = "deskryptor650", sep = "~")

deskryptory650 <- as.data.frame(table(deskryptory650$deskryptor650)) %>%
  cSplit(.,"Var1",sep = "~",direction = "wide") %>%
  rename(X650 = Var1_1,
         redaktor_dzialu = Var1_2,
         DZ_DZIAL_ID = Var1_3,
         DZ_NAZWA = Var1_4) %>%
  mutate(X650 = str_remove_all(X650,"\\\\7\\$a"),
         X650 = str_remove_all(X650,"\\$2DBN"),
         X650 = str_remove_all(X650,"\\\\\\\\"),
         X650 = str_replace_all(X650,"\\$.|\\|"," "),
         X650 = str_replace_all(X650," ",".*"),
         X650 = str_replace_all(X650, "[^\\p{L}\\d\\*\\.\\-\\s]", "")) %>%
  arrange(X650,-Freq,DZ_NAZWA)

deskryptory650$id_grupy <- cumsum(!duplicated(deskryptory650[2]))
deskryptory650 <- deskryptory650[!duplicated(deskryptory650$id_grupy),] %>%
  select(-id_grupy) %>%
  arrange(-Freq)

x <- 1:length(deskryptory650$X650)
test <- data.frame(stringsAsFactors = FALSE)
for (i in x) {
  progress(match(i,x), max.value = length(x))
    do_przedmiotowej3 <- przedmiotowa_redaktorzy %>%
      mutate(redaktor_dzialu = ifelse(grepl(deskryptory650$X650[i],X650),as.character(deskryptory650$redaktor_dzialu)[i],NA),
             ile = ifelse(grepl(deskryptory650$X650[i],X650),as.integer(deskryptory650$Freq)[i],NA),
             co = ifelse(grepl(deskryptory650$X650[i],X650),as.character(deskryptory650$X650)[i],NA),
             DZ_DZIAL_ID = ifelse(grepl(deskryptory650$X650[i],X650),as.integer(deskryptory650$DZ_DZIAL_ID)[i],NA),
             DZ_NAZWA = ifelse(grepl(deskryptory650$X650[i],X650),as.character(deskryptory650$DZ_NAZWA)[i],NA)) %>%
      filter(!is.na(redaktor_dzialu))
    if (length(do_przedmiotowej3$redaktor_dzialu)>0) {
      test <- rbind(test,do_przedmiotowej3)
    } else {}
    
}
count <- as.data.frame(table(test$ZA_UWAGI))
do_przedmiotowej3 <- merge(test,count, by.x = "ZA_UWAGI",by.y = "Var1") %>%
  mutate(dlugosc = nchar(co)) %>%
  arrange(-Freq,ZA_UWAGI,-dlugosc,-ile)

do_przedmiotowej3$id_grupy <- cumsum(!duplicated(do_przedmiotowej3[1]))
do_przedmiotowej3 <- do_przedmiotowej3[!duplicated(do_przedmiotowej3$id_grupy),] %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(do_przedmiotowej1))

do_przedmiotowej <- rbind(do_przedmiotowej1,do_przedmiotowej2,do_przedmiotowej3)
#przypisanie przedmiotowej na podstawie słownika pojęć
do_przedmiotowej <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  left_join(.,do_przedmiotowej,by="ZA_UWAGI") %>%
#przypisanie na podstawie zdefiniowanych słów (dopisanie do gotowego pliku)
  mutate(redaktor_dzialu = ifelse(is.na(redaktor_dzialu),
                                  ifelse(grepl("teatr",X655,ignore.case = TRUE)|grepl("teatr",X650,ignore.case = TRUE),"MARTAK",
                                         ifelse(grepl("film",X655,ignore.case = TRUE)|grepl("film",X650,ignore.case = TRUE),"OLA",
                                                    ifelse(grepl("telewizj",X655,ignore.case = TRUE)|grepl("telewizj",X650,ignore.case = TRUE),"EWA",
                                                           ifelse(grepl("radio",X655,ignore.case = TRUE)|grepl("radio",X650,ignore.case = TRUE),"EWA",
                                                                  ifelse(grepl("czasopism",X655,ignore.case = TRUE)|grepl("czasopism",X650,ignore.case = TRUE),"TOMASZ",
                                                                         ifelse(grepl("wydawnictw",X655,ignore.case = TRUE)|grepl("wydawnictw",X650,ignore.case = TRUE),"BARBARAW",
                                                                                ifelse(grepl("od 1989",X655,ignore.case = TRUE)|grepl("od 1989",X650,ignore.case = TRUE),"PAULINA",
                                                                                       ifelse(grepl("ćwicze|zadan|szkoł|szkół|scenariusz zajęć|scenariusze zajęć|zajęć|pomocnicz|podręcznik",X655,ignore.case = TRUE)|grepl("ćwicze|zadan|szkoł|szkół|scenariusz zajęć|scenariusze zajęć|zajęć|pomocnicz|podręcznik",X650,ignore.case = TRUE),"KAROLINA",
                                                                                              ifelse(grepl("sceniczn",X655,ignore.case = TRUE)|grepl("sceniczn",X650,ignore.case = TRUE),"MARTAK",
                                                                                                     ifelse(grepl("teoria|socjologia|antropologia|metafizyk|interpretac|filozof",X655,ignore.case = TRUE)|grepl("teoria|socjologia|antropologia|metafizyk|interpretac|filozof",X650,ignore.case = TRUE),"PAULINA",
                                                                                                            ifelse(grepl("ludow|zwycz|obycz|folkl",X655,ignore.case = TRUE)|grepl("ludow|zwycz|obycz|folkl",X650,ignore.case = TRUE),"ANIA",
                                                                                                                   ifelse(grepl("katolic|biblia|biblij|kościół",X655,ignore.case = TRUE)|grepl("katolic|biblia|biblij|kościół",X650,ignore.case = TRUE),"BEATAS",
                                                                                                                          ifelse(grepl("druk|rękopi|inkunab|inwent|bibliogr|słownik|bibliotek",X655,ignore.case = TRUE)|grepl("druk|rękopi|inkunab|inwent|bibliogr|słownik|bibliotek",X650,ignore.case = TRUE),"IZA",
                                                                                                                                 ifelse(grepl("zabawk|dziec",X655,ignore.case = TRUE)|grepl("zabawk|dziec",X650,ignore.case = TRUE),"BARBARAW",
                                                                                                                                        ifelse(grepl("tematyka|20-21 w.|21 w.",X655,ignore.case = TRUE)|grepl("tematyka|20-21 w.|21 w.",X650,ignore.case = TRUE),"PAULINA",
                                                                                                                                               ifelse(grepl("19|18|17|16|15|14|13",X655,ignore.case = TRUE)|grepl("19|18|17|16|15|14|13",X650,ignore.case = TRUE),"GOSIA",
                                                                                                                                                      ifelse(grepl("polityk",X655,X655,ignore.case = TRUE)|grepl("polityk",X650,X655,ignore.case = TRUE),"PAULINA",
                                                                                                                                                             ifelse(grepl("historia",X655,X655,ignore.case = TRUE)|grepl("historia",X650,X655,ignore.case = TRUE),"GOSIA",NA)))))))))))))))))),as.character(redaktor_dzialu)),
         RZ_RODZAJ_ID = ifelse(is.na(RZ_RODZAJ_ID),21,as.integer(RZ_RODZAJ_ID)),
         RZ_NAZWA = ifelse(is.na(RZ_NAZWA),"książka w haśle rzeczowym",as.character(RZ_NAZWA))) %>%
  select(names(do_przedmiotowej1)) %>%
  filter(!is.na(redaktor_dzialu))
#wydobycie zbioru, który ciągle nie ma przypisanych redaktorów do przedmiotowej
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  filter(ZA_UWAGI %notin% do_przedmiotowej$ZA_UWAGI)
#dla książek, które mają kilku autorów w osoba_bn_temat - przypisanie do redaktora powszechnej - BEATAD?
do_przedmiotowej4 <- przedmiotowa_redaktorzy %>%
  filter(!is.na(osoba_bn_temat)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym",
         redaktor_dzialu = "BEATAD") %>%
  select(names(do_przedmiotowej1))
#dla książek, które nie mają wypełnionego osoba_bn_autor - przypisanie do Marty z x? czy losowo do kogoś?
do_przedmiotowej5 <- przedmiotowa_redaktorzy %>%
  filter(is.na(osoba_bn_autor)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym",
         redaktor_dzialu = "MARTAKx") %>%
  select(names(do_przedmiotowej1))
#połaczenie wszystkich przedmiotowych z przypisanymi redaktorami w jeden plik
do_przedmiotowej <- rbind(do_przedmiotowej,do_przedmiotowej4,do_przedmiotowej5)
#dla książek, które mają wypełnione osoba_bn_autor - zmiana na podmiotową do ręcznego przejrzenia i przypisanie redaktorów
###przypisanie do podmiotowej!!!!!!!!!!!!!!!!!!!###############
do_podmiotowej1 <- przedmiotowa_redaktorzy %>%
  filter(!is.na(osoba_bn_autor))
#trzeba zaktualizować w bn_ok, że teraz to są podmiotowe
#lista rekordów do przepisania z przedmiotowej na podmiotową
lista_do_przepisania <- do_podmiotowej1$ZA_UWAGI
bn_ok$rodzaj_ksiazki[bn_ok$ZA_UWAGI %in% lista_do_przepisania] <- "podmiotowa"
#to, co było podmiotową bez autora powinno trafić do literatury anonimowej z pracownikiem przedm, więc teraz trzeba to przepisać do przedmiotowej - na końcu procesu
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa"&X100=="")
#przypisanie literatury anonimowej
#655
marc_field_655 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X655)%>%
  filter(X655!="") %>%
  mutate(X655=str_replace_all(X655,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X655",sep = "~",direction = "long") %>%
  filter(X655!="") %>%
  mutate(X655=str_remove_all(X655,"^\\|")) %>%
  mutate(indicator = str_replace_all(X655,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X655,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_655)[1]))
colnames(empty_table) <-subfield_list
marc_field_655<-cbind(marc_field_655,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_655$X655 <- str_replace(marc_field_655$X655,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_655[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_655$X655),str_replace_all(gsub(string,"\\3",marc_field_655$X655),"\\${2}.", "~"),NA)
}

marc_field_655 <- marc_field_655 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()
trim <- function (x) gsub("^\\s+|\\s+$", "", x)
PBL_literatury_anonimowe <- PBL_dzialy_path %>%
  filter(grepl("Utwory anonim",DZ_NAZWA)) %>%
  select(DZ_DZIAL_ID,DZ_NAZWA,NAD_NAD_DZ_DZIAL_ID) %>%
  left_join(.,redaktorzy_dzialow,by = c("NAD_NAD_DZ_DZIAL_ID"="DZ_DZIAL_ID")) %>%
  select(1,DZ_NAZWA = 2,5) %>%
  filter(DZ_DZIAL_ID %notin% c(1922,1983)) %>%
  group_by(DZ_DZIAL_ID) %>%
  mutate(nazwa = paste(trim(unlist(str_extract_all(DZ_NAZWA,"(?<=\\()(.*?)(?=\\(|\\))"))),collapse = "|"),
         nazwa = str_remove_all(nazwa,"(.)(?=\\||$)"),
         nazwa = str_remove(nazwa,"literatur. "),
         nazwa = ifelse(nazwa=="","polsk",as.character(nazwa)),
         redaktor_dzialu = ifelse(is.na(redaktor_dzialu),"ANIA",as.character(redaktor_dzialu))) %>%
  ungroup()

reczne <- data.frame(DZ_DZIAL_ID = c(899,694,694,1174,145,1220),DZ_NAZWA = c("Utwory anonimowe (Indii)","Utwory anonimowe (brytyjska i irlandzka)","Utwory anonimowe (brytyjska i irlandzka)","Utwory anonimowe (starosłowiańska)","Utwory anonimowe i ulotne","Utwory anonimowe (turecka)"), redaktor_dzialu = c("EWA","BEATAK","BEATAK","BEATAD","ANIA","EWA"), nazwa = c("indyjsk","walijsk","angielsk","starorusk","kaszubsk","nogajsk"))

PBL_literatury_anonimowe <- rbind(PBL_literatury_anonimowe,reczne)

marc_field_655 <- sqldf("select *
                            from marc_field_655 a
                            left join PBL_literatury_anonimowe b on a.`$a` like ('%'||b.nazwa||'%')") %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_655$same <- cumsum(!duplicated(marc_field_655[1]))
marc_field_655 <- marc_field_655[!duplicated(marc_field_655$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(marc_field_600))
###przypisanie do redaktorów literatury anonimowej na podstawie literatury z pola 650
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa"&X100=="") %>%
  filter(ZA_UWAGI %notin% marc_field_655$ZA_UWAGI)

#650
marc_field_650 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X650)%>%
  filter(X650!="") %>%
  mutate(X650=str_replace_all(X650,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X650",sep = "~",direction = "long") %>%
  filter(X650!="") %>%
  mutate(X650=str_remove_all(X650,"^\\|")) %>%
  mutate(indicator = str_replace_all(X650,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X650,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_650)[1]))
colnames(empty_table) <-subfield_list
marc_field_650<-cbind(marc_field_650,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_650$X650 <- str_replace(marc_field_650$X650,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_650[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_650$X650),str_replace_all(gsub(string,"\\3",marc_field_650$X650),"\\${2}.", "~"),NA)
}

marc_field_650 <- marc_field_650 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_650 <- sqldf("select *
                            from marc_field_650 a
                            left join PBL_literatury_anonimowe b on a.`$a` like ('%'||b.nazwa||'%')") %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_650$same <- cumsum(!duplicated(marc_field_650[1]))
marc_field_650 <- marc_field_650[!duplicated(marc_field_650$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(marc_field_600))
do_podmiotowej1 <- rbind(marc_field_655,marc_field_650)

#co zrobić z pozostałymi podmiotowymi anonimowymi, których nie udało się przypisać?
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa"&X100=="") %>%
  filter(ZA_UWAGI %notin% do_podmiotowej1$ZA_UWAGI) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym",
         redaktor_dzialu = "KAROLINA") %>%
  select(names(do_przedmiotowej1))
do_podmiotowej1 <- rbind(do_podmiotowej1,podmiotowa_redaktorzy)

#lista rekordów do przepisania z podmiotowej na przedmiotową (chodzi o literaturę anonimową)
lista_do_przepisania <- do_podmiotowej1$ZA_UWAGI
bn_ok$rodzaj_ksiazki[bn_ok$ZA_UWAGI %in% lista_do_przepisania] <- "przedmiotowa"

#przetworzenie całej podmiotowej (bo plik do_podmiotowej1 już jest w środku)
###przypisanie redaktora na podstawie osoby z 100 jako twórcy (autora) (tabela pbl-bn-viaf)- książki twórcy
#100
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(ZA_UWAGI %notin% do_podmiotowej1$ZA_UWAGI)

marc_field_100 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
marc_field_100 <- marc_field_100 %>%
  select(ZA_UWAGI,`$a`,`$d`,`$c`) %>%
  mutate(name = ifelse(!is.na(`$c`)&substr(`$c`,nchar(`$c`),nchar(`$c`))==";",paste(`$a`,`$c`,`$d`,sep = " "),ifelse(!is.na(`$d`),paste(`$a`,`$d`,sep = " "),as.character(`$a`)))) %>%
  select(ZA_UWAGI,name) %>%
  mutate(name = str_replace(name,"(\\))(\\.$)","\\1"),
         name = str_replace(name, "([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)","\\1")) %>%
  group_by(ZA_UWAGI) %>%
  mutate(name = paste(name,collapse = "|")) %>%
  ungroup() %>%
  unique()

do_podmiotowej2 <- marc_field_100 %>%
  unique() %>%
  inner_join(.,pbl_viaf,by = c("name" = "BN_name")) %>%
  inner_join(.,PBL_tworcy,by = c("pbl_id"="TW_TWORCA_ID")) %>%
  left_join(.,redaktorzy_dzialow,by = c("TW_DZ_DZIAL_ID"="DZ_DZIAL_ID")) %>%
  select(ZA_UWAGI,TW_TWORCA_ID=pbl_id,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID=TW_DZ_DZIAL_ID,DZ_NAZWA=DZ_NAZWA.x,redaktor_dzialu) %>%
  mutate(RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>%
  unique()

###przypisanie redaktora na podstawie zbieżności fraz nazewnictwa osoby z 100 z twórcą pbl (dla tych, które nie zostały zmapowane na linii pbl-bn) - książki twórcy
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(ZA_UWAGI %notin% do_podmiotowej1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej2$ZA_UWAGI)

#100
marc_field_100 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}

do_podmiotowej3 <- marc_field_100 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique() %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(`$a`,collapse = "|")) %>%
  ungroup() %>%
  unique() %>%
  mutate(TW_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                              ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
         TW_IMIE = ifelse(grepl("\\|",`$a`),"*",
                          ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*")),
         nazwa = str_replace_all(str_to_lower(paste(TW_NAZWISKO,TW_IMIE,sep = "")), "\\W", "")) %>%
  select(ZA_UWAGI,TW_NAZWISKO,TW_IMIE,nazwa) %>% 
  inner_join(.,PBL_tworcy_podm %>% select(TW_TWORCA_ID,DZ_DZIAL_ID=TW_DZ_DZIAL_ID,DZ_NAZWA,nazwa),by="nazwa")
do_podmiotowej3$same <- cumsum(!duplicated(do_podmiotowej3[1:4]))
do_podmiotowej3 <- do_podmiotowej3 %>% 
  arrange(ZA_UWAGI,TW_NAZWISKO,TW_IMIE,nazwa,TW_TWORCA_ID)
do_podmiotowej3 <- do_podmiotowej3[!duplicated(do_podmiotowej3$same),] %>% 
  mutate(DZ_DZIAL_ID = as.integer(DZ_DZIAL_ID),
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>% 
  inner_join(.,redaktorzy_dzialow %>% select(DZ_DZIAL_ID,redaktor_dzialu),by="DZ_DZIAL_ID") %>% 
  select(names(do_podmiotowej1))

###przypisanie autorów podmiotowej do literatur i przypisanie do redaktorów na podstawie kodu literatury z pola X080 i tworzenie nowych twórców na podstawie pola 100
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(ZA_UWAGI %notin% do_podmiotowej1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej2$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej3$ZA_UWAGI)

podmiotowa_redaktorzy <- sqldf("select *
                            from podmiotowa_redaktorzy a
                            join BN_PBL_lista_literatur b on a.X080 like ('%'||b.ukd_ogolne||'%')")

###dodawanie nazewnictw nowych twórców
#100
marc_field_100 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}

marc_field_100 <- marc_field_100 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique() %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(`$a`,collapse = "|")) %>%
  ungroup() %>%
  unique() %>%
  mutate(TW_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                              ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
         TW_IMIE = ifelse(grepl("\\|",`$a`),"*",
                          ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
  select(ZA_UWAGI,TW_NAZWISKO,TW_IMIE)
#join na podstawie identycznego id
podmiotowa_redaktorzy <- podmiotowa_redaktorzy %>%
  left_join(.,marc_field_100,by="ZA_UWAGI") %>%
  mutate(pbl_nazwa = as.character(pbl_nazwa)) %>%
  mutate(DZ_DZIAL_ID = ifelse(nazwa_prosta=="polsk"&substr(pbl_nazwa,nchar(pbl_nazwa),nchar(pbl_nazwa))!=substr(TW_NAZWISKO,1,1),NA,as.integer(pbl_id))) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

count <- as.data.frame(table(podmiotowa_redaktorzy$ZA_UWAGI))
podmiotowa_redaktorzy <- merge(podmiotowa_redaktorzy,count,by.x = "ZA_UWAGI",by.y = "Var1") %>%
  mutate(dlugosc = nchar(ukd_ogolne)) %>%
  arrange(-Freq,ZA_UWAGI,-dlugosc,pbl_id)
podmiotowa_redaktorzy$same <- cumsum(!duplicated(podmiotowa_redaktorzy[1]))
do_podmiotowej4 <- podmiotowa_redaktorzy[!duplicated(podmiotowa_redaktorzy$same),] %>%
  mutate(TW_TWORCA_ID = NA) %>%
  rename(DZ_NAZWA = pbl_nazwa) %>%
  select(ZA_UWAGI,TW_TWORCA_ID,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  mutate(RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)")

###przypisanie autorów podmiotowej do literatur i przypisanie do redaktorów na podstawie literatury z pola 655 i tworzenie nowych twórców na podstawie pola 100
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(ZA_UWAGI %notin% do_podmiotowej1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej2$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej3$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej4$ZA_UWAGI)

#655
marc_field_655 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X655)%>%
  filter(X655!="") %>%
  mutate(X655=str_replace_all(X655,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X655",sep = "~",direction = "long") %>%
  filter(X655!="") %>%
  mutate(X655=str_remove_all(X655,"^\\|")) %>%
  mutate(indicator = str_replace_all(X655,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X655,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_655)[1]))
colnames(empty_table) <-subfield_list
marc_field_655<-cbind(marc_field_655,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_655$X655 <- str_replace(marc_field_655$X655,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_655[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_655$X655),str_replace_all(gsub(string,"\\3",marc_field_655$X655),"\\${2}.", "~"),NA)
}

marc_field_655 <- marc_field_655 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_655 <- sqldf("select *
                            from marc_field_655 a
                            left join PBL_hasla_osobowe b on a.`$a` like ('%'||b.nazwa||'%')")

###dodawanie nazewnictw nowych twórców
#100
marc_field_100 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}

marc_field_100 <- marc_field_100 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique() %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(`$a`,collapse = "|")) %>%
  ungroup() %>%
  unique() %>%
  mutate(TW_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                              ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
         TW_IMIE = ifelse(grepl("\\|",`$a`),"*",
                          ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
  select(ZA_UWAGI,TW_NAZWISKO,TW_IMIE)
#join na podstawie identycznego id
marc_field_655 <- marc_field_655 %>%
  left_join(.,marc_field_100,by="ZA_UWAGI") %>%
  mutate(DZ_DZIAL_ID = ifelse(nazwa=="polsk"&substr(DZ_NAZWA,nchar(DZ_NAZWA),nchar(DZ_NAZWA))!=substr(TW_NAZWISKO,1,1),NA,as.integer(DZ_DZIAL_ID))) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)
    
marc_field_655$same <- cumsum(!duplicated(marc_field_655[1]))
do_podmiotowej5 <- marc_field_655[!duplicated(marc_field_655$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,TW_NAZWISKO,TW_IMIE,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>%
  select(names(marc_field_600))

###przypisanie autorów podmiotowej do literatur i przypisanie do redaktorów na podstawie literatury z pola 655 i tworzenie nowych twórców na podstawie pola 100
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(ZA_UWAGI %notin% do_podmiotowej1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej2$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej3$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej4$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej5$ZA_UWAGI)

#650
marc_field_650 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X650)%>%
  filter(X650!="") %>%
  mutate(X650=str_replace_all(X650,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X650",sep = "~",direction = "long") %>%
  filter(X650!="") %>%
  mutate(X650=str_remove_all(X650,"^\\|")) %>%
  mutate(indicator = str_replace_all(X650,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X650,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_650)[1]))
colnames(empty_table) <-subfield_list
marc_field_650<-cbind(marc_field_650,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_650$X650 <- str_replace(marc_field_650$X650,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_650[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_650$X650),str_replace_all(gsub(string,"\\3",marc_field_650$X650),"\\${2}.", "~"),NA)
}

marc_field_650 <- marc_field_650 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_650 <- sqldf("select *
                            from marc_field_650 a
                            left join PBL_hasla_osobowe b on a.`$a` like ('%'||b.nazwa||'%')")  %>%
  left_join(.,marc_field_100,by="ZA_UWAGI") %>%
  mutate(DZ_DZIAL_ID = ifelse(nazwa=="polsk"&substr(DZ_NAZWA,nchar(DZ_NAZWA),nchar(DZ_NAZWA))!=substr(TW_NAZWISKO,1,1),NA,as.integer(DZ_DZIAL_ID))) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_650$same <- cumsum(!duplicated(marc_field_650[1]))
do_podmiotowej6 <- marc_field_650[!duplicated(marc_field_650$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,TW_NAZWISKO,TW_IMIE,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>%
  select(names(marc_field_600))
#co zostało do podmiotowej?
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(ZA_UWAGI %notin% do_podmiotowej1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej2$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej3$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej4$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej5$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej6$ZA_UWAGI)
#naddatek przypisać Marcie jako podmiotową bez twórców i czy_automatycznie <- nie
do_podmiotowej7 <- podmiotowa_redaktorzy %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)",
         redaktor_dzialu = "MARTAKx") %>%
  select(names(do_podmiotowej5))
#trzeba zaktualizować w bn_ok, że teraz to nie są automatyczne
lista_do_przepisania <- do_podmiotowej7$ZA_UWAGI
bn_ok$czy_automatycznie[bn_ok$ZA_UWAGI %in% lista_do_przepisania] <- "nie"
#połączenie przydziału podmiotowych w jeden plik
do_podmiotowej <- rbind(do_podmiotowej1,do_podmiotowej2,do_podmiotowej3,do_podmiotowej4,do_podmiotowej5,do_podmiotowej6,do_podmiotowej7)

#przypisanie antologii do Tomka i do literatur na podstawie 080
antologie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki == "antologia")
PBL_dzialy_antologie <- PBL_dzialy_path %>%
  filter(grepl("antolog",DZ_NAZWA,ignore.case = TRUE)) %>%
  left_join(.,redaktorzy_dzialow,by="DZ_DZIAL_ID") %>%
  select(DZ_DZIAL_ID,DZ_NAZWA=DZ_NAZWA.x,redaktor_dzialu) %>%
  mutate(redaktor_dzialu = ifelse(is.na(redaktor_dzialu),"TOMASZ",as.character(redaktor_dzialu)))

PBL_dzialy_antologie <- sqldf("select *
                            from PBL_dzialy_antologie a
                            left join (select c.ukd_ogolne,c.nazwa_prosta,c.pbl_id,c.pbl_nazwa,c.pbl_id_literatury,c.pbl_literatura from BN_PBL_lista_literatur c) b on a.DZ_NAZWA like ('%'||b.nazwa_prosta||'%')") %>%
  mutate(ukd_ogolne = ifelse(DZ_DZIAL_ID==146,"821.162.1",as.character(ukd_ogolne)),
         nazwa_prosta = ifelse(DZ_DZIAL_ID==146,"polsk",as.character(nazwa_prosta))) %>%
  filter(!is.na(ukd_ogolne)) %>%
  filter(DZ_DZIAL_ID!=744) %>%
  select(1:5) 

antologie_redaktorzy <- sqldf("select *
                            from antologie_redaktorzy a
                            join PBL_dzialy_antologie b on a.X080 like ('%'||b.ukd_ogolne||'%')")

count <- as.data.frame(table(antologie_redaktorzy$ZA_UWAGI))
antologie_redaktorzy <- merge(antologie_redaktorzy,count,by.x = "ZA_UWAGI",by.y = "Var1") %>%
  mutate(dlugosc = nchar(ukd_ogolne)) %>%
  arrange(-Freq,ZA_UWAGI,-dlugosc,DZ_DZIAL_ID)
antologie_redaktorzy$same <- cumsum(!duplicated(antologie_redaktorzy[1]))
do_antologii1 <- antologie_redaktorzy[!duplicated(antologie_redaktorzy$same),] %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA) %>%
  select(ZA_UWAGI,TW_TWORCA_ID,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  mutate(RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym")
#przypisanie antologii do Tomka i do literatur na podstawie 665
antologie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki == "antologia") %>%
  filter(ZA_UWAGI %notin% do_antologii1$ZA_UWAGI)

marc_field_655 <- antologie_redaktorzy %>%
  select(ZA_UWAGI,X655)%>%
  filter(X655!="") %>%
  mutate(X655=str_replace_all(X655,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X655",sep = "~",direction = "long") %>%
  filter(X655!="") %>%
  mutate(X655=str_remove_all(X655,"^\\|")) %>%
  mutate(indicator = str_replace_all(X655,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(antologie_redaktorzy$X655,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_655)[1]))
colnames(empty_table) <-subfield_list
marc_field_655<-cbind(marc_field_655,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_655$X655 <- str_replace(marc_field_655$X655,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_655[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_655$X655),str_replace_all(gsub(string,"\\3",marc_field_655$X655),"\\${2}.", "~"),NA)
}

marc_field_655 <- marc_field_655 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_655 <- sqldf("select *
                            from marc_field_655 a
                            left join PBL_dzialy_antologie b on a.`$a` like ('%'||b.nazwa_prosta||'%')") %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_655$same <- cumsum(!duplicated(marc_field_655[1]))
do_antologii2 <- marc_field_655[!duplicated(marc_field_655$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(do_antologii1))
#przypisanie antologii do Tomka i do literatur na podstawie 665
antologie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki == "antologia") %>%
  filter(ZA_UWAGI %notin% do_antologii1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_antologii2$ZA_UWAGI)

marc_field_650 <- antologie_redaktorzy %>%
  select(ZA_UWAGI,X650)%>%
  filter(X650!="") %>%
  mutate(X650=str_replace_all(X650,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X650",sep = "~",direction = "long") %>%
  filter(X650!="") %>%
  mutate(X650=str_remove_all(X650,"^\\|")) %>%
  mutate(indicator = str_replace_all(X650,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(antologie_redaktorzy$X650,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_650)[1]))
colnames(empty_table) <-subfield_list
marc_field_650<-cbind(marc_field_650,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_650$X650 <- str_replace(marc_field_650$X650,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_650[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_650$X650),str_replace_all(gsub(string,"\\3",marc_field_650$X650),"\\${2}.", "~"),NA)
}

marc_field_650 <- marc_field_650 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_650 <- sqldf("select *
                            from marc_field_650 a
                            left join PBL_dzialy_antologie b on a.`$a` like ('%'||b.nazwa_prosta||'%')") %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_650$same <- cumsum(!duplicated(marc_field_650[1]))
do_antologii3 <- marc_field_650[!duplicated(marc_field_650$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(do_antologii1))
#reszta antologii bez działu po prostu przypisana do Tomka
antologie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki == "antologia") %>%
  filter(ZA_UWAGI %notin% do_antologii1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_antologii2$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_antologii3$ZA_UWAGI)

do_antologii4 <- antologie_redaktorzy %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym",
         redaktor_dzialu = "TOMASZ") %>%
  select(names(do_antologii1))

do_antologii <- rbind(do_antologii1,do_antologii2,do_antologii3,do_antologii4)
###przypisanie redaktora do współwydań na podstawie osoby z 245 jako twórcy (autora) (tabela pbl-bn-viaf)- książki twórcy
wspolwydanie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie")

do_wspolwydania1 <- wspolwydanie_redaktorzy %>% 
  select(ZA_UWAGI,X245) %>% 
  mutate(X245 = str_extract(X245, "(?<=\\/\\$c)(.*?)(?= ;|$)"),
         X245 = str_remove(X245,"\\.$"),
         X245 = str_remove(X245,"\\["),
         X245 = str_remove(X245,"\\]"),
         nazwisko = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),as.character(X245),str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\3")),
         imie = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),"*",str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\1")),
         name = paste(nazwisko,imie,sep = ", ")) %>%
  inner_join(.,pbl_viaf,by = c("name" = "BN_name")) %>%
  left_join(.,PBL_tworcy,by = c("pbl_id"="TW_TWORCA_ID")) %>%
  left_join(.,redaktorzy_dzialow,by = c("TW_DZ_DZIAL_ID"="DZ_DZIAL_ID")) %>%
  select(ZA_UWAGI,TW_TWORCA_ID=pbl_id,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID=TW_DZ_DZIAL_ID,DZ_NAZWA=DZ_NAZWA.x,redaktor_dzialu) %>%
  mutate(RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>%
  unique()
###przypisanie redaktora na podstawie zbieżności fraz nazewnictwa osoby z 245 z twórcą pbl (dla tych, które nie zostały zmapowane na linii pbl-bn) - książki twórcy
wspolwydanie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie") %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania1$ZA_UWAGI)

do_wspolwydania2 <- wspolwydanie_redaktorzy %>% 
  select(ZA_UWAGI,X245) %>% 
  mutate(X245 = str_extract(X245, "(?<=\\/\\$c)(.*?)(?= ;|$)"),
         X245 = str_remove(X245,"\\.$"),
         X245 = str_remove(X245,"\\["),
         X245 = str_remove(X245,"\\]"),
         nazwisko = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),as.character(X245),str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\3")),
         imie = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),"*",str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\1")),
         name = paste(nazwisko,imie,sep = ", "),
         nazwa = str_replace_all(str_to_lower(name), "\\W", "")) %>% 
  inner_join(.,PBL_tworcy_podm %>% select(TW_TWORCA_ID,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID=TW_DZ_DZIAL_ID,DZ_NAZWA,nazwa),by="nazwa")
do_wspolwydania2$same <- cumsum(!duplicated(do_wspolwydania2[1:4]))
do_wspolwydania2 <- do_wspolwydania2 %>% 
  arrange(ZA_UWAGI,nazwisko,imie,nazwa,TW_TWORCA_ID)
do_wspolwydania2 <- do_wspolwydania2[!duplicated(do_wspolwydania2$same),] %>% 
  mutate(DZ_DZIAL_ID = as.integer(DZ_DZIAL_ID),
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>% 
  inner_join(.,redaktorzy_dzialow %>% select(DZ_DZIAL_ID,redaktor_dzialu),by="DZ_DZIAL_ID") %>% 
  select(names(do_wspolwydania1))
###przypisanie autorów podmiotowej do literatur i przypisanie do redaktorów na podstawie kodu literatury z pola X080 i tworzenie nowych twórców na podstawie pola 245
wspolwydanie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie") %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania1$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania2$ZA_UWAGI)

wspolwydanie_redaktorzy <- sqldf("select *
                            from wspolwydanie_redaktorzy a
                            join BN_PBL_lista_literatur b on a.X080 like ('%'||b.ukd_ogolne||'%')")
do_wspolwydania3 <- wspolwydanie_redaktorzy %>% 
  select(ZA_UWAGI,X245,pbl_id,pbl_nazwa,redaktor_dzialu,pbl_id_literatury,pbl_literatura,nazwa_prosta,ukd_ogolne) %>% 
  mutate(X245 = str_extract(X245, "(?<=\\/\\$c)(.*?)(?= ;|$)"),
         X245 = str_remove(X245,"\\.$"),
         X245 = str_remove(X245,"\\["),
         X245 = str_remove(X245,"\\]"),
         nazwisko = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),as.character(X245),str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\3")),
         imie = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),"*",str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\1")),
         name = paste(nazwisko,imie,sep = ", ")) %>%
  mutate(pbl_nazwa = as.character(pbl_nazwa)) %>%
  mutate(DZ_DZIAL_ID = ifelse(nazwa_prosta=="polsk"&substr(pbl_nazwa,nchar(pbl_nazwa),nchar(pbl_nazwa))!=substr(nazwisko,1,1),NA,as.integer(pbl_id))) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)
count <- as.data.frame(table(do_wspolwydania3$ZA_UWAGI))
do_wspolwydania3 <- merge(do_wspolwydania3,count,by.x = "ZA_UWAGI",by.y = "Var1") %>%
  mutate(dlugosc = nchar(ukd_ogolne)) %>%
  arrange(-Freq,ZA_UWAGI,-dlugosc,pbl_id)
do_wspolwydania3$same <- cumsum(!duplicated(do_wspolwydania3[1]))
do_wspolwydania3 <- do_wspolwydania3[!duplicated(do_wspolwydania3$same),] %>%
  mutate(TW_TWORCA_ID = NA) %>%
  rename(DZ_NAZWA = pbl_nazwa,
         TW_NAZWISKO = nazwisko,
         TW_IMIE = imie) %>%
  select(ZA_UWAGI,TW_TWORCA_ID,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  mutate(RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)")
###przypisanie autorów podmiotowej do literatur i przypisanie do redaktorów na podstawie literatury z pola 655 i tworzenie nowych twórców na podstawie pola 245
wspolwydanie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie") %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania1$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania2$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania3$ZA_UWAGI)

#655
marc_field_655 <- wspolwydanie_redaktorzy %>%
  select(ZA_UWAGI,X655)%>%
  filter(X655!="") %>%
  mutate(X655=str_replace_all(X655,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X655",sep = "~",direction = "long") %>%
  filter(X655!="") %>%
  mutate(X655=str_remove_all(X655,"^\\|")) %>%
  mutate(indicator = str_replace_all(X655,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(wspolwydanie_redaktorzy$X655,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_655)[1]))
colnames(empty_table) <-subfield_list
marc_field_655<-cbind(marc_field_655,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_655$X655 <- str_replace(marc_field_655$X655,subfield_list_char[i],"|\\1")
}
if (nrow(marc_field_655)>0) {
  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_655[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_655$X655),str_replace_all(gsub(string,"\\3",marc_field_655$X655),"\\${2}.", "~"),NA)
}

marc_field_655 <- marc_field_655 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_655 <- sqldf("select *
                            from marc_field_655 a
                            left join PBL_hasla_osobowe b on a.`$a` like ('%'||b.nazwa||'%')")

###dodawanie nazewnictw nowych twórców na podstawie 245
marc_field_245 <- wspolwydanie_redaktorzy %>% 
  select(ZA_UWAGI,X245) %>% 
  mutate(X245 = str_extract(X245, "(?<=\\/\\$c)(.*?)(?= ;|$)"),
         X245 = str_remove(X245,"\\.$"),
         X245 = str_remove(X245,"\\["),
         X245 = str_remove(X245,"\\]"),
         nazwisko = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),as.character(X245),str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\3")),
         imie = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),"*",str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\1")),
         name = paste(nazwisko,imie,sep = ", "))
#join na podstawie identycznego id
marc_field_655 <- marc_field_655 %>%
  left_join(.,marc_field_245,by="ZA_UWAGI") %>%
  mutate(DZ_DZIAL_ID = ifelse(nazwa=="polsk"&substr(DZ_NAZWA,nchar(DZ_NAZWA),nchar(DZ_NAZWA))!=substr(nazwisko,1,1),NA,as.integer(DZ_DZIAL_ID))) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)
marc_field_655$same <- cumsum(!duplicated(marc_field_655[1]))
do_wspolwydania4 <- marc_field_655[!duplicated(marc_field_655$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,TW_NAZWISKO=nazwisko,TW_IMIE=imie,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>%
  select(names(do_wspolwydania3))
} else {
  marc_field_245 <- wspolwydanie_redaktorzy %>% 
  select(ZA_UWAGI,X245) %>% 
  mutate(X245 = str_extract(X245, "(?<=\\/\\$c)(.*?)(?= ;|$)"),
         X245 = str_remove(X245,"\\.$"),
         X245 = str_remove(X245,"\\["),
         X245 = str_remove(X245,"\\]"),
         nazwisko = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),as.character(X245),str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\3")),
         imie = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),"*",str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\1")),
         name = paste(nazwisko,imie,sep = ", "))
  do_wspolwydania4 <- data.frame(stringsAsFactors = FALSE)
}
###przypisanie autorów podmiotowej do literatur i przypisanie do redaktorów na podstawie literatury z pola 650 i tworzenie nowych twórców na podstawie pola 245
wspolwydanie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie") %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania1$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania2$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania3$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania4$ZA_UWAGI)

#650
if (max(nchar(wspolwydanie_redaktorzy$X650))>0) {
marc_field_650 <- wspolwydanie_redaktorzy %>%
  select(ZA_UWAGI,X650)%>%
  filter(X650!="") %>%
  mutate(X650=str_replace_all(X650,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X650",sep = "~",direction = "long") %>%
  filter(X650!="") %>%
  mutate(X650=str_remove_all(X650,"^\\|")) %>%
  mutate(indicator = str_replace_all(X650,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(wspolwydanie_redaktorzy$X650,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_650)[1]))
colnames(empty_table) <-subfield_list
marc_field_650<-cbind(marc_field_650,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_650$X650 <- str_replace(marc_field_650$X650,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_650[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_650$X650),str_replace_all(gsub(string,"\\3",marc_field_650$X650),"\\${2}.", "~"),NA)
}

marc_field_650 <- marc_field_650 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_650 <- sqldf("select *
                            from marc_field_650 a
                            left join PBL_hasla_osobowe b on a.`$a` like ('%'||b.nazwa||'%')")  %>%
  left_join(.,marc_field_245,by="ZA_UWAGI") %>%
  mutate(DZ_DZIAL_ID = ifelse(nazwa=="polsk"&substr(DZ_NAZWA,nchar(DZ_NAZWA),nchar(DZ_NAZWA))!=substr(nazwisko,1,1),NA,as.integer(DZ_DZIAL_ID))) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_650$same <- cumsum(!duplicated(marc_field_650[1]))
do_wspolwydania5 <- marc_field_650[!duplicated(marc_field_650$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,TW_NAZWISKO=nazwisko,TW_IMIE=imie,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>%
  select(names(do_wspolwydania4))
} else {
  do_wspolwydania5 <- do_wspolwydania1[0,]
}
#co zostało do współwydania?
wspolwydanie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie") %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania1$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania2$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania3$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania4$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania5$ZA_UWAGI)

#naddatek przypisać Marcie jako podmiotową bez twórców i czy_automatycznie <- nie
do_wspolwydania6 <- wspolwydanie_redaktorzy %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)",
         redaktor_dzialu = "MARTAKx") %>%
  select(names(do_wspolwydania5))
#trzeba zaktualizować w bn_ok, że teraz to nie są automatyczne
lista_do_przepisania <- do_wspolwydania6$ZA_UWAGI
bn_ok$czy_automatycznie[bn_ok$ZA_UWAGI %in% lista_do_przepisania] <- "nie"
#połączenie przydziału współwydań w jeden plik
do_wspolwydania <- rbind(do_wspolwydania1,do_wspolwydania2,do_wspolwydania3,do_wspolwydania4,do_wspolwydania5,do_wspolwydania6)

#połączenie przydziałów w jeden plik (z wykluczeniem współwydania, bo ono idzie po za_uwagi)
redaktorzy_zapisow <- rbind(do_podmiotowej,do_przedmiotowej,do_antologii,do_wspolwydania)
#połączenie przypisania ze zbiorem

bn_ok <- bn_ok %>%
  left_join(.,redaktorzy_zapisow,by="ZA_UWAGI") %>%
  mutate(redaktor_dzialu = ifelse(is.na(DZ_NAZWA),as.character(redaktor_dzialu),
                                  ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - B","PAULINA",
                                         ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - G","MARTAK",
                                                ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - L","BEATAK",
                                                       ifelse(DZ_NAZWA=="Literatura współczesna (utwory anonimowe i ulotne)","ANIA",
                                                              ifelse(DZ_NAZWA=="Utwory anonimowe i ulotne","ANIA",
                                                                     ifelse(DZ_NAZWA=="Utwory anonimowe i ulotne (epoka nieznana)","ANIA",
                                                                            ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - N","GOSIA",
                                                                                   ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - O","IZA",
                                                                                          ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - Q","IZA",
                                                                                                 ifelse(DZ_NAZWA=="Literatura brytyjska i irlandzka","EWA",
                                                                                                        ifelse(DZ_NAZWA=="Utwory anonimowe (brytyjska i irlandzka)","EWA",
                                                                                                               ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - U","PAULINA",
                                                                                                                      ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - X","PAULINA",
                                                                                                                             ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - V","PAULINA",
                                                                                                                                    ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - Y","PAULINA",
                                                                                                                                           ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - C","GOSIA",
                                                                                                                                                  ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - D","GOSIA",as.character(redaktor_dzialu))))))))))))))))))))

#ujednolicenie literatury dla kilku zapisów nowego twórcy
kilka_literatur_nowego_tworcy <- bn_ok %>%
  select(id,TW_TWORCA_ID,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(is.na(TW_TWORCA_ID)&!is.na(TW_NAZWISKO)) %>%
  select(-TW_TWORCA_ID) %>%
  arrange(TW_NAZWISKO,TW_IMIE) %>%
  group_by_at(vars(2:3)) %>%
  mutate(unikatowy_dzial = paste(unique(DZ_DZIAL_ID),collapse = "|"),
         DZ_DZIAL_ID = paste(DZ_DZIAL_ID,collapse = "|"),
         DZ_NAZWA = paste(DZ_NAZWA,collapse = "|"),
         redaktor_dzialu = paste(redaktor_dzialu,collapse = "|"),
         id = paste(id,collapse = "|")) %>%
  ungroup() %>%
  unique() %>%
  filter(grepl("\\|",unikatowy_dzial)) %>%
  select(-unikatowy_dzial)
if(nrow(kilka_literatur_nowego_tworcy)>0) {
  kilka_literatur_nowego_tworcy <- kilka_literatur_nowego_tworcy %>%
  mutate(id_grupy = 1:nrow(.)) %>%
  cSplit(.,c("id","DZ_DZIAL_ID","DZ_NAZWA","redaktor_dzialu"),sep = "|",direction = "long")

kilka_literatur_nowego_tworcy[,2:7][duplicated(kilka_literatur_nowego_tworcy$id_grupy),] <- NA
kilka_literatur_nowego_tworcy <- fill_(kilka_literatur_nowego_tworcy, names(kilka_literatur_nowego_tworcy))
#zaktualizowanie zbioru podmiotowych o ujednolicone działy dla nowych twórców
x <- 1:length(kilka_literatur_nowego_tworcy$id)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  bn_ok$DZ_DZIAL_ID[bn_ok$id==kilka_literatur_nowego_tworcy$id[i]] <- kilka_literatur_nowego_tworcy$DZ_DZIAL_ID[i]
  bn_ok$DZ_NAZWA[bn_ok$id==kilka_literatur_nowego_tworcy$id[i]] <- as.character(kilka_literatur_nowego_tworcy$DZ_NAZWA)[i]
  bn_ok$redaktor_dzialu[bn_ok$id==kilka_literatur_nowego_tworcy$id[i]] <- as.character(kilka_literatur_nowego_tworcy$redaktor_dzialu)[i]
}
}

#jeśli nie ma działu lub rodzaju zapisu, to wpisać id i nazwę do ustalenia
bn_ok <- bn_ok %>%
  mutate(DZ_DZIAL_ID =ifelse(is.na(DZ_DZIAL_ID),0,as.integer(DZ_DZIAL_ID)),
         DZ_NAZWA = ifelse(is.na(DZ_NAZWA),"-- do ustalenia --",as.character(DZ_NAZWA)),
         RZ_RODZAJ_ID =ifelse(is.na(RZ_RODZAJ_ID),0,as.integer(RZ_RODZAJ_ID)),
         RZ_NAZWA = ifelse(is.na(RZ_NAZWA),"-- do ustalenia --",as.character(RZ_NAZWA)))

#usunięcie nadwyżki z książek z działów IH
slowniki_jezykowe_zle <- bn_ok %>% 
  filter(DZ_NAZWA=="Słowniki językowe") %>% 
  filter(!grepl("słownik",X655,ignore.case = TRUE))

slowniki_biograficzne_zle <- bn_ok %>% 
  filter(DZ_NAZWA=="Słowniki biograficzne") %>% 
  filter(!(grepl("Słownik biograficzny|Biografia",X655)&(grepl("pisarz|litera|aktor|scenograf|nauczyciel|akademi|nauk|filolog|kryty|lit\\.",X655,ignore.case = TRUE)|grepl("pisarz|litera|aktor|scenograf|nauczyciel|akademi|nauk|filolog|kryty|lit\\.",X650,ignore.case = TRUE))))

bn_ok <- bn_ok %>%
  filter(ZA_UWAGI %notin% slowniki_jezykowe_zle$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% slowniki_biograficzne_zle$ZA_UWAGI)
chunk11 <- bn_ok
test <- bn_ok %>%
  left_join(out %>% select(rekord_BN,pracownik),by=c("ZA_UWAGI"="rekord_BN")) %>%
  mutate(pracownik = ifelse(is.na(pracownik),as.character(redaktor_dzialu),as.character(pracownik)),
         pracownik = str_replace(pracownik,"(^.*?)(\\_.*$)","\\1"))
Komunikaty ostrzegawcze:
1: Unknown or uninitialised column: 'drugi_autor'. 
2: Unknown or uninitialised column: 'drugi_autor'. 
3: Unknown or uninitialised column: 'drugi_autor'. 
4: Unknown or uninitialised column: 'drugi_autor'. 
5: Unknown or uninitialised column: 'drugi_autor'. 
6: Unknown or uninitialised column: 'drugi_autor'. 
count3 <- as.data.frame(table(test$pracownik))
bn_ok <- chunk11
Komunikaty ostrzegawcze:
1: Unknown or uninitialised column: 'drugi_autor'. 
2: Unknown or uninitialised column: 'drugi_autor'. 
3: Unknown or uninitialised column: 'drugi_autor'. 
4: Unknown or uninitialised column: 'drugi_autor'. 
5: Unknown or uninitialised column: 'drugi_autor'. 
6: Unknown or uninitialised column: 'drugi_autor'. 
data <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  mutate(redaktor_dzialu = paste(redaktor_dzialu,"_podm",sep = ""))

#uwolnienie kolumn z danymi z bn i przetworzenie do PBL
#1: za_uwagi, rz_nazwa, za_ro_rok, za_type, rz_rodzaj_id, tw_tworca_id, tw_nazwisko, tw_imie, dz_dzial_id, dz_nazwa, redaktor_dzialu
pola_pbl <- data %>%
  select(ZA_UWAGI, RZ_NAZWA, ZA_RO_ROK = rok, RZ_RODZAJ_ID, TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, redaktor_dzialu) %>%
  mutate(ZA_TYPE = "KS")
#2: autor
BN_autor <- data %>%
  select(X100,X245,ZA_UWAGI)
#pole 100
marc_field_100 <- BN_autor %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(BN_autor$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
#pole 245
marc_field_245 <- BN_autor %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(BN_autor$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
BN_autor <- marc_field_100 %>%
 select(ZA_UWAGI,`$a`,`$b`) %>%
 unique() %>%
 mutate(`$a` = ifelse(!is.na(`$b`),paste(`$a`,`$b`,sep = " "),as.character(`$a`))) %>%
 mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
 unique() %>%
 mutate(AM_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                             ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
        AM_IMIE = ifelse(grepl("\\|",`$a`),"*",
                         ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
 select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE) %>%
 left_join(.,marc_field_245,by="ZA_UWAGI") %>%
 select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE, X245c = `$c`)
  
x <- 1:lengths(BN_autor[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_autor$czy_nazwisko[i] <- grepl(BN_autor$AM_NAZWISKO[i],BN_autor$X245c[i])
  BN_autor$czy_imie[i] <- grepl(BN_autor$AM_IMIE[i],BN_autor$X245c[i])
}
Progress:    1 on 7870  Progress:    2 on 7870  Progress:    3 on 7870  Progress:    4 on 7870  Progress:    5 on 7870  Progress:    6 on 7870  Progress:    7 on 7870  Progress:    8 on 7870  Progress:    9 on 7870  Progress:   10 on 7870  Progress:   11 on 7870  Progress:   12 on 7870  Progress:   13 on 7870  Progress:   14 on 7870  Progress:   15 on 7870  Progress:   16 on 7870  Progress:   17 on 7870  Progress:   18 on 7870  Progress:   19 on 7870  Progress:   20 on 7870  Progress:   21 on 7870  Progress:   22 on 7870  Progress:   23 on 7870  Progress:   24 on 7870  Progress:   25 on 7870  Progress:   26 on 7870  Progress:   27 on 7870  Progress:   28 on 7870  Progress:   29 on 7870  Progress:   30 on 7870  Progress:   31 on 7870  Progress:   32 on 7870  Progress:   33 on 7870  Progress:   34 on 7870  Progress:   35 on 7870  Progress:   36 on 7870  Progress:   37 on 7870  Progress:   38 on 7870  Progress:   39 on 7870  Progress:   40 on 7870  Progress:   41 on 7870  Progress:   42 on 7870  Progress:   43 on 7870  Progress:   44 on 7870  Progress:   45 on 7870  Progress:   46 on 7870  Progress:   47 on 7870  Progress:   48 on 7870  Progress:   49 on 7870  Progress:   50 on 7870  Progress:   51 on 7870  Progress:   52 on 7870  Progress:   53 on 7870  Progress:   54 on 7870  Progress:   55 on 7870  Progress:   56 on 7870  Progress:   57 on 7870  Progress:   58 on 7870  Progress:   59 on 7870  Progress:   60 on 7870  Progress:   61 on 7870  Progress:   62 on 7870  Progress:   63 on 7870  Progress:   64 on 7870  Progress:   65 on 7870  Progress:   66 on 7870  Progress:   67 on 7870  Progress:   68 on 7870  Progress:   69 on 7870  Progress:   70 on 7870  Progress:   71 on 7870  Progress:   72 on 7870  Progress:   73 on 7870  Progress:   74 on 7870  Progress:   75 on 7870  Progress:   76 on 7870  Progress:   77 on 7870  Progress:   78 on 7870  Progress:   79 on 7870  Progress:   80 on 7870  Progress:   81 on 7870  Progress:   82 on 7870  Progress:   83 on 7870  Progress:   84 on 7870  Progress:   85 on 7870  Progress:   86 on 7870  Progress:   87 on 7870  Progress:   88 on 7870  Progress:   89 on 7870  Progress:   90 on 7870  Progress:   91 on 7870  Progress:   92 on 7870  Progress:   93 on 7870  Progress:   94 on 7870  Progress:   95 on 7870  Progress:   96 on 7870  Progress:   97 on 7870  Progress:   98 on 7870  Progress:   99 on 7870  Progress:  100 on 7870  Progress:  101 on 7870  Progress:  102 on 7870  Progress:  103 on 7870  Progress:  104 on 7870  Progress:  105 on 7870  Progress:  106 on 7870  Progress:  107 on 7870  Progress:  108 on 7870  Progress:  109 on 7870  Progress:  110 on 7870  Progress:  111 on 7870  Progress:  112 on 7870  Progress:  113 on 7870  Progress:  114 on 7870  Progress:  115 on 7870  Progress:  116 on 7870  Progress:  117 on 7870  Progress:  118 on 7870  Progress:  119 on 7870  Progress:  120 on 7870  Progress:  121 on 7870  Progress:  122 on 7870  Progress:  123 on 7870  Progress:  124 on 7870  Progress:  125 on 7870  Progress:  126 on 7870  Progress:  127 on 7870  Progress:  128 on 7870  Progress:  129 on 7870  Progress:  130 on 7870  Progress:  131 on 7870  Progress:  132 on 7870  Progress:  133 on 7870  Progress:  134 on 7870  Progress:  135 on 7870  Progress:  136 on 7870  Progress:  137 on 7870  Progress:  138 on 7870  Progress:  139 on 7870  Progress:  140 on 7870  Progress:  141 on 7870  Progress:  142 on 7870  Progress:  143 on 7870  Progress:  144 on 7870  Progress:  145 on 7870  Progress:  146 on 7870  Progress:  147 on 7870  Progress:  148 on 7870  Progress:  149 on 7870  Progress:  150 on 7870  Progress:  151 on 7870  Progress:  152 on 7870  Progress:  153 on 7870  Progress:  154 on 7870  Progress:  155 on 7870  Progress:  156 on 7870  Progress:  157 on 7870  Progress:  158 on 7870  Progress:  159 on 7870  Progress:  160 on 7870  Progress:  161 on 7870  Progress:  162 on 7870  Progress:  163 on 7870  Progress:  164 on 7870  Progress:  165 on 7870  Progress:  166 on 7870  Progress:  167 on 7870  Progress:  168 on 7870  Progress:  169 on 7870  Progress:  170 on 7870  Progress:  171 on 7870  Progress:  172 on 7870  Progress:  173 on 7870  Progress:  174 on 7870  Progress:  175 on 7870  Progress:  176 on 7870  Progress:  177 on 7870  Progress:  178 on 7870  Progress:  179 on 7870  Progress:  180 on 7870  Progress:  181 on 7870  Progress:  182 on 7870  Progress:  183 on 7870  Progress:  184 on 7870  Progress:  185 on 7870  Progress:  186 on 7870  Progress:  187 on 7870  Progress:  188 on 7870  Progress:  189 on 7870  Progress:  190 on 7870  Progress:  191 on 7870  Progress:  192 on 7870  Progress:  193 on 7870  Progress:  194 on 7870  Progress:  195 on 7870  Progress:  196 on 7870  Progress:  197 on 7870  Progress:  198 on 7870  Progress:  199 on 7870  Progress:  200 on 7870  Progress:  201 on 7870  Progress:  202 on 7870  Progress:  203 on 7870  Progress:  204 on 7870  Progress:  205 on 7870  Progress:  206 on 7870  Progress:  207 on 7870  Progress:  208 on 7870  Progress:  209 on 7870  Progress:  210 on 7870  Progress:  211 on 7870  Progress:  212 on 7870  Progress:  213 on 7870  Progress:  214 on 7870  Progress:  215 on 7870  Progress:  216 on 7870  Progress:  217 on 7870  Progress:  218 on 7870  Progress:  219 on 7870  Progress:  220 on 7870  Progress:  221 on 7870  Progress:  222 on 7870  Progress:  223 on 7870  Progress:  224 on 7870  Progress:  225 on 7870  Progress:  226 on 7870  Progress:  227 on 7870  Progress:  228 on 7870  Progress:  229 on 7870  Progress:  230 on 7870  Progress:  231 on 7870  Progress:  232 on 7870  Progress:  233 on 7870  Progress:  234 on 7870  Progress:  235 on 7870  Progress:  236 on 7870  Progress:  237 on 7870  Progress:  238 on 7870  Progress:  239 on 7870  Progress:  240 on 7870  Progress:  241 on 7870  Progress:  242 on 7870  Progress:  243 on 7870  Progress:  244 on 7870  Progress:  245 on 7870  Progress:  246 on 7870  Progress:  247 on 7870  Progress:  248 on 7870  Progress:  249 on 7870  Progress:  250 on 7870  Progress:  251 on 7870  Progress:  252 on 7870  Progress:  253 on 7870  Progress:  254 on 7870  Progress:  255 on 7870  Progress:  256 on 7870  Progress:  257 on 7870  Progress:  258 on 7870  Progress:  259 on 7870  Progress:  260 on 7870  Progress:  261 on 7870  Progress:  262 on 7870  Progress:  263 on 7870  Progress:  264 on 7870  Progress:  265 on 7870  Progress:  266 on 7870  Progress:  267 on 7870  Progress:  268 on 7870  Progress:  269 on 7870  Progress:  270 on 7870  Progress:  271 on 7870  Progress:  272 on 7870  Progress:  273 on 7870  Progress:  274 on 7870  Progress:  275 on 7870  Progress:  276 on 7870  Progress:  277 on 7870  Progress:  278 on 7870  Progress:  279 on 7870  Progress:  280 on 7870  Progress:  281 on 7870  Progress:  282 on 7870  Progress:  283 on 7870  Progress:  284 on 7870  Progress:  285 on 7870  Progress:  286 on 7870  Progress:  287 on 7870  Progress:  288 on 7870  Progress:  289 on 7870  Progress:  290 on 7870  Progress:  291 on 7870  Progress:  292 on 7870  Progress:  293 on 7870  Progress:  294 on 7870  Progress:  295 on 7870  Progress:  296 on 7870  Progress:  297 on 7870  Progress:  298 on 7870  Progress:  299 on 7870  Progress:  300 on 7870  Progress:  301 on 7870  Progress:  302 on 7870  Progress:  303 on 7870  Progress:  304 on 7870  Progress:  305 on 7870  Progress:  306 on 7870  Progress:  307 on 7870  Progress:  308 on 7870  Progress:  309 on 7870  Progress:  310 on 7870  Progress:  311 on 7870  Progress:  312 on 7870  Progress:  313 on 7870  Progress:  314 on 7870  Progress:  315 on 7870  Progress:  316 on 7870  Progress:  317 on 7870  Progress:  318 on 7870  Progress:  319 on 7870  Progress:  320 on 7870  Progress:  321 on 7870  Progress:  322 on 7870  Progress:  323 on 7870  Progress:  324 on 7870  Progress:  325 on 7870  Progress:  326 on 7870  Progress:  327 on 7870  Progress:  328 on 7870  Progress:  329 on 7870  Progress:  330 on 7870  Progress:  331 on 7870  Progress:  332 on 7870  Progress:  333 on 7870  Progress:  334 on 7870  Progress:  335 on 7870  Progress:  336 on 7870  Progress:  337 on 7870  Progress:  338 on 7870  Progress:  339 on 7870  Progress:  340 on 7870  Progress:  341 on 7870  Progress:  342 on 7870  Progress:  343 on 7870  Progress:  344 on 7870  Progress:  345 on 7870  Progress:  346 on 7870  Progress:  347 on 7870  Progress:  348 on 7870  Progress:  349 on 7870  Progress:  350 on 7870  Progress:  351 on 7870  Progress:  352 on 7870  Progress:  353 on 7870  Progress:  354 on 7870  Progress:  355 on 7870  Progress:  356 on 7870  Progress:  357 on 7870  Progress:  358 on 7870  Progress:  359 on 7870  Progress:  360 on 7870  Progress:  361 on 7870  Progress:  362 on 7870  Progress:  363 on 7870  Progress:  364 on 7870  Progress:  365 on 7870  Progress:  366 on 7870  Progress:  367 on 7870  Progress:  368 on 7870  Progress:  369 on 7870  Progress:  370 on 7870  Progress:  371 on 7870  Progress:  372 on 7870  Progress:  373 on 7870  Progress:  374 on 7870  Progress:  375 on 7870  Progress:  376 on 7870  Progress:  377 on 7870  Progress:  378 on 7870  Progress:  379 on 7870  Progress:  380 on 7870  Progress:  381 on 7870  Progress:  382 on 7870  Progress:  383 on 7870  Progress:  384 on 7870  Progress:  385 on 7870  Progress:  386 on 7870  Progress:  387 on 7870  Progress:  388 on 7870  Progress:  389 on 7870  Progress:  390 on 7870  Progress:  391 on 7870  Progress:  392 on 7870  Progress:  393 on 7870  Progress:  394 on 7870  Progress:  395 on 7870  Progress:  396 on 7870  Progress:  397 on 7870  Progress:  398 on 7870  Progress:  399 on 7870  Progress:  400 on 7870  Progress:  401 on 7870  Progress:  402 on 7870  Progress:  403 on 7870  Progress:  404 on 7870  Progress:  405 on 7870  Progress:  406 on 7870  Progress:  407 on 7870  Progress:  408 on 7870  Progress:  409 on 7870  Progress:  410 on 7870  Progress:  411 on 7870  Progress:  412 on 7870  Progress:  413 on 7870  Progress:  414 on 7870  Progress:  415 on 7870  Progress:  416 on 7870  Progress:  417 on 7870  Progress:  418 on 7870  Progress:  419 on 7870  Progress:  420 on 7870  Progress:  421 on 7870  Progress:  422 on 7870  Progress:  423 on 7870  Progress:  424 on 7870  Progress:  425 on 7870  Progress:  426 on 7870  Progress:  427 on 7870  Progress:  428 on 7870  Progress:  429 on 7870  Progress:  430 on 7870  Progress:  431 on 7870  Progress:  432 on 7870  Progress:  433 on 7870  Progress:  434 on 7870  Progress:  435 on 7870  Progress:  436 on 7870  Progress:  437 on 7870  Progress:  438 on 7870  Progress:  439 on 7870  Progress:  440 on 7870  Progress:  441 on 7870  Progress:  442 on 7870  Progress:  443 on 7870  Progress:  444 on 7870  Progress:  445 on 7870  Progress:  446 on 7870  Progress:  447 on 7870  Progress:  448 on 7870  Progress:  449 on 7870  Progress:  450 on 7870  Progress:  451 on 7870  Progress:  452 on 7870  Progress:  453 on 7870  Progress:  454 on 7870  Progress:  455 on 7870  Progress:  456 on 7870  Progress:  457 on 7870  Progress:  458 on 7870  Progress:  459 on 7870  Progress:  460 on 7870  Progress:  461 on 7870  Progress:  462 on 7870  Progress:  463 on 7870  Progress:  464 on 7870  Progress:  465 on 7870  Progress:  466 on 7870  Progress:  467 on 7870  Progress:  468 on 7870  Progress:  469 on 7870  Progress:  470 on 7870  Progress:  471 on 7870  Progress:  472 on 7870  Progress:  473 on 7870  Progress:  474 on 7870  Progress:  475 on 7870  Progress:  476 on 7870  Progress:  477 on 7870  Progress:  478 on 7870  Progress:  479 on 7870  Progress:  480 on 7870  Progress:  481 on 7870  Progress:  482 on 7870  Progress:  483 on 7870  Progress:  484 on 7870  Progress:  485 on 7870  Progress:  486 on 7870  Progress:  487 on 7870  Progress:  488 on 7870  Progress:  489 on 7870  Progress:  490 on 7870  Progress:  491 on 7870  Progress:  492 on 7870  Progress:  493 on 7870  Progress:  494 on 7870  Progress:  495 on 7870  Progress:  496 on 7870  Progress:  497 on 7870  Progress:  498 on 7870  Progress:  499 on 7870  Progress:  500 on 7870  Progress:  501 on 7870  Progress:  502 on 7870  Progress:  503 on 7870  Progress:  504 on 7870  Progress:  505 on 7870  Progress:  506 on 7870  Progress:  507 on 7870  Progress:  508 on 7870  Progress:  509 on 7870  Progress:  510 on 7870  Progress:  511 on 7870  Progress:  512 on 7870  Progress:  513 on 7870  Progress:  514 on 7870  Progress:  515 on 7870  Progress:  516 on 7870  Progress:  517 on 7870  Progress:  518 on 7870  Progress:  519 on 7870  Progress:  520 on 7870  Progress:  521 on 7870  Progress:  522 on 7870  Progress:  523 on 7870  Progress:  524 on 7870  Progress:  525 on 7870  Progress:  526 on 7870  Progress:  527 on 7870  Progress:  528 on 7870  Progress:  529 on 7870  Progress:  530 on 7870  Progress:  531 on 7870  Progress:  532 on 7870  Progress:  533 on 7870  Progress:  534 on 7870  Progress:  535 on 7870  Progress:  536 on 7870  Progress:  537 on 7870  Progress:  538 on 7870  Progress:  539 on 7870  Progress:  540 on 7870  Progress:  541 on 7870  Progress:  542 on 7870  Progress:  543 on 7870  Progress:  544 on 7870  Progress:  545 on 7870  Progress:  546 on 7870  Progress:  547 on 7870  Progress:  548 on 7870  Progress:  549 on 7870  Progress:  550 on 7870  Progress:  551 on 7870  Progress:  552 on 7870  Progress:  553 on 7870  Progress:  554 on 7870  Progress:  555 on 7870  Progress:  556 on 7870  Progress:  557 on 7870  Progress:  558 on 7870  Progress:  559 on 7870  Progress:  560 on 7870  Progress:  561 on 7870  Progress:  562 on 7870  Progress:  563 on 7870  Progress:  564 on 7870  Progress:  565 on 7870  Progress:  566 on 7870  Progress:  567 on 7870  Progress:  568 on 7870  Progress:  569 on 7870  Progress:  570 on 7870  Progress:  571 on 7870  Progress:  572 on 7870  Progress:  573 on 7870  Progress:  574 on 7870  Progress:  575 on 7870  Progress:  576 on 7870  Progress:  577 on 7870  Progress:  578 on 7870  Progress:  579 on 7870  Progress:  580 on 7870  Progress:  581 on 7870  Progress:  582 on 7870  Progress:  583 on 7870  Progress:  584 on 7870  Progress:  585 on 7870  Progress:  586 on 7870  Progress:  587 on 7870  Progress:  588 on 7870  Progress:  589 on 7870  Progress:  590 on 7870  Progress:  591 on 7870  Progress:  592 on 7870  Progress:  593 on 7870  Progress:  594 on 7870  Progress:  595 on 7870  Progress:  596 on 7870  Progress:  597 on 7870  Progress:  598 on 7870  Progress:  599 on 7870  Progress:  600 on 7870  Progress:  601 on 7870  Progress:  602 on 7870  Progress:  603 on 7870  Progress:  604 on 7870  Progress:  605 on 7870  Progress:  606 on 7870  Progress:  607 on 7870  Progress:  608 on 7870  Progress:  609 on 7870  Progress:  610 on 7870  Progress:  611 on 7870  Progress:  612 on 7870  Progress:  613 on 7870  Progress:  614 on 7870  Progress:  615 on 7870  Progress:  616 on 7870  Progress:  617 on 7870  Progress:  618 on 7870  Progress:  619 on 7870  Progress:  620 on 7870  Progress:  621 on 7870  Progress:  622 on 7870  Progress:  623 on 7870  Progress:  624 on 7870  Progress:  625 on 7870  Progress:  626 on 7870  Progress:  627 on 7870  Progress:  628 on 7870  Progress:  629 on 7870  Progress:  630 on 7870  Progress:  631 on 7870  Progress:  632 on 7870  Progress:  633 on 7870  Progress:  634 on 7870  Progress:  635 on 7870  Progress:  636 on 7870  Progress:  637 on 7870  Progress:  638 on 7870  Progress:  639 on 7870  Progress:  640 on 7870  Progress:  641 on 7870  Progress:  642 on 7870  Progress:  643 on 7870  Progress:  644 on 7870  Progress:  645 on 7870  Progress:  646 on 7870  Progress:  647 on 7870  Progress:  648 on 7870  Progress:  649 on 7870  Progress:  650 on 7870  Progress:  651 on 7870  Progress:  652 on 7870  Progress:  653 on 7870  Progress:  654 on 7870  Progress:  655 on 7870  Progress:  656 on 7870  Progress:  657 on 7870  Progress:  658 on 7870  Progress:  659 on 7870  Progress:  660 on 7870  Progress:  661 on 7870  Progress:  662 on 7870  Progress:  663 on 7870  Progress:  664 on 7870  Progress:  665 on 7870  Progress:  666 on 7870  Progress:  667 on 7870  Progress:  668 on 7870  Progress:  669 on 7870  Progress:  670 on 7870  Progress:  671 on 7870  Progress:  672 on 7870  Progress:  673 on 7870  Progress:  674 on 7870  Progress:  675 on 7870  Progress:  676 on 7870  Progress:  677 on 7870  Progress:  678 on 7870  Progress:  679 on 7870  Progress:  680 on 7870  Progress:  681 on 7870  Progress:  682 on 7870  Progress:  683 on 7870  Progress:  684 on 7870  Progress:  685 on 7870  Progress:  686 on 7870  Progress:  687 on 7870  Progress:  688 on 7870  Progress:  689 on 7870  Progress:  690 on 7870  Progress:  691 on 7870  Progress:  692 on 7870  Progress:  693 on 7870  Progress:  694 on 7870  Progress:  695 on 7870  Progress:  696 on 7870  Progress:  697 on 7870  Progress:  698 on 7870  Progress:  699 on 7870  Progress:  700 on 7870  Progress:  701 on 7870  Progress:  702 on 7870  Progress:  703 on 7870  Progress:  704 on 7870  Progress:  705 on 7870  Progress:  706 on 7870  Progress:  707 on 7870  Progress:  708 on 7870  Progress:  709 on 7870  Progress:  710 on 7870  Progress:  711 on 7870  Progress:  712 on 7870  Progress:  713 on 7870  Progress:  714 on 7870  Progress:  715 on 7870  Progress:  716 on 7870  Progress:  717 on 7870  Progress:  718 on 7870  Progress:  719 on 7870  Progress:  720 on 7870  Progress:  721 on 7870  Progress:  722 on 7870  Progress:  723 on 7870  Progress:  724 on 7870  Progress:  725 on 7870  Progress:  726 on 7870  Progress:  727 on 7870  Progress:  728 on 7870  Progress:  729 on 7870  Progress:  730 on 7870  Progress:  731 on 7870  Progress:  732 on 7870  Progress:  733 on 7870  Progress:  734 on 7870  Progress:  735 on 7870  Progress:  736 on 7870  Progress:  737 on 7870  Progress:  738 on 7870  Progress:  739 on 7870  Progress:  740 on 7870  Progress:  741 on 7870  Progress:  742 on 7870  Progress:  743 on 7870  Progress:  744 on 7870  Progress:  745 on 7870  Progress:  746 on 7870  Progress:  747 on 7870  Progress:  748 on 7870  Progress:  749 on 7870  Progress:  750 on 7870  Progress:  751 on 7870  Progress:  752 on 7870  Progress:  753 on 7870  Progress:  754 on 7870  Progress:  755 on 7870  Progress:  756 on 7870  Progress:  757 on 7870  Progress:  758 on 7870  Progress:  759 on 7870  Progress:  760 on 7870  Progress:  761 on 7870  Progress:  762 on 7870  Progress:  763 on 7870  Progress:  764 on 7870  Progress:  765 on 7870  Progress:  766 on 7870  Progress:  767 on 7870  Progress:  768 on 7870  Progress:  769 on 7870  Progress:  770 on 7870  Progress:  771 on 7870  Progress:  772 on 7870  Progress:  773 on 7870  Progress:  774 on 7870  Progress:  775 on 7870  Progress:  776 on 7870  Progress:  777 on 7870  Progress:  778 on 7870  Progress:  779 on 7870  Progress:  780 on 7870  Progress:  781 on 7870  Progress:  782 on 7870  Progress:  783 on 7870  Progress:  784 on 7870  Progress:  785 on 7870  Progress:  786 on 7870  Progress:  787 on 7870  Progress:  788 on 7870  Progress:  789 on 7870  Progress:  790 on 7870  Progress:  791 on 7870  Progress:  792 on 7870  Progress:  793 on 7870  Progress:  794 on 7870  Progress:  795 on 7870  Progress:  796 on 7870  Progress:  797 on 7870  Progress:  798 on 7870  Progress:  799 on 7870  Progress:  800 on 7870  Progress:  801 on 7870  Progress:  802 on 7870  Progress:  803 on 7870  Progress:  804 on 7870  Progress:  805 on 7870  Progress:  806 on 7870  Progress:  807 on 7870  Progress:  808 on 7870  Progress:  809 on 7870  Progress:  810 on 7870  Progress:  811 on 7870  Progress:  812 on 7870  Progress:  813 on 7870  Progress:  814 on 7870  Progress:  815 on 7870  Progress:  816 on 7870  Progress:  817 on 7870  Progress:  818 on 7870  Progress:  819 on 7870  Progress:  820 on 7870  Progress:  821 on 7870  Progress:  822 on 7870  Progress:  823 on 7870  Progress:  824 on 7870  Progress:  825 on 7870  Progress:  826 on 7870  Progress:  827 on 7870  Progress:  828 on 7870  Progress:  829 on 7870  Progress:  830 on 7870  Progress:  831 on 7870  Progress:  832 on 7870  Progress:  833 on 7870  Progress:  834 on 7870  Progress:  835 on 7870  Progress:  836 on 7870  Progress:  837 on 7870  Progress:  838 on 7870  Progress:  839 on 7870  Progress:  840 on 7870  Progress:  841 on 7870  Progress:  842 on 7870  Progress:  843 on 7870  Progress:  844 on 7870  Progress:  845 on 7870  Progress:  846 on 7870  Progress:  847 on 7870  Progress:  848 on 7870  Progress:  849 on 7870  Progress:  850 on 7870  Progress:  851 on 7870  Progress:  852 on 7870  Progress:  853 on 7870  Progress:  854 on 7870  Progress:  855 on 7870  Progress:  856 on 7870  Progress:  857 on 7870  Progress:  858 on 7870  Progress:  859 on 7870  Progress:  860 on 7870  Progress:  861 on 7870  Progress:  862 on 7870  Progress:  863 on 7870  Progress:  864 on 7870  Progress:  865 on 7870  Progress:  866 on 7870  Progress:  867 on 7870  Progress:  868 on 7870  Progress:  869 on 7870  Progress:  870 on 7870  Progress:  871 on 7870  Progress:  872 on 7870  Progress:  873 on 7870  Progress:  874 on 7870  Progress:  875 on 7870  Progress:  876 on 7870  Progress:  877 on 7870  Progress:  878 on 7870  Progress:  879 on 7870  Progress:  880 on 7870  Progress:  881 on 7870  Progress:  882 on 7870  Progress:  883 on 7870  Progress:  884 on 7870  Progress:  885 on 7870  Progress:  886 on 7870  Progress:  887 on 7870  Progress:  888 on 7870  Progress:  889 on 7870  Progress:  890 on 7870  Progress:  891 on 7870  Progress:  892 on 7870  Progress:  893 on 7870  Progress:  894 on 7870  Progress:  895 on 7870  Progress:  896 on 7870  Progress:  897 on 7870  Progress:  898 on 7870  Progress:  899 on 7870  Progress:  900 on 7870  Progress:  901 on 7870  Progress:  902 on 7870  Progress:  903 on 7870  Progress:  904 on 7870  Progress:  905 on 7870  Progress:  906 on 7870  Progress:  907 on 7870  Progress:  908 on 7870  Progress:  909 on 7870  Progress:  910 on 7870  Progress:  911 on 7870  Progress:  912 on 7870  Progress:  913 on 7870  Progress:  914 on 7870  Progress:  915 on 7870  Progress:  916 on 7870  Progress:  917 on 7870  Progress:  918 on 7870  Progress:  919 on 7870  Progress:  920 on 7870  Progress:  921 on 7870  Progress:  922 on 7870  Progress:  923 on 7870  Progress:  924 on 7870  Progress:  925 on 7870  Progress:  926 on 7870  Progress:  927 on 7870  Progress:  928 on 7870  Progress:  929 on 7870  Progress:  930 on 7870  Progress:  931 on 7870  Progress:  932 on 7870  Progress:  933 on 7870  Progress:  934 on 7870  Progress:  935 on 7870  Progress:  936 on 7870  Progress:  937 on 7870  Progress:  938 on 7870  Progress:  939 on 7870  Progress:  940 on 7870  Progress:  941 on 7870  Progress:  942 on 7870  Progress:  943 on 7870  Progress:  944 on 7870  Progress:  945 on 7870  Progress:  946 on 7870  Progress:  947 on 7870  Progress:  948 on 7870  Progress:  949 on 7870  Progress:  950 on 7870  Progress:  951 on 7870  Progress:  952 on 7870  Progress:  953 on 7870  Progress:  954 on 7870  Progress:  955 on 7870  Progress:  956 on 7870  Progress:  957 on 7870  Progress:  958 on 7870  Progress:  959 on 7870  Progress:  960 on 7870  Progress:  961 on 7870  Progress:  962 on 7870  Progress:  963 on 7870  Progress:  964 on 7870  Progress:  965 on 7870  Progress:  966 on 7870  Progress:  967 on 7870  Progress:  968 on 7870  Progress:  969 on 7870  Progress:  970 on 7870  Progress:  971 on 7870  Progress:  972 on 7870  Progress:  973 on 7870  Progress:  974 on 7870  Progress:  975 on 7870  Progress:  976 on 7870  Progress:  977 on 7870  Progress:  978 on 7870  Progress:  979 on 7870  Progress:  980 on 7870  Progress:  981 on 7870  Progress:  982 on 7870  Progress:  983 on 7870  Progress:  984 on 7870  Progress:  985 on 7870  Progress:  986 on 7870  Progress:  987 on 7870  Progress:  988 on 7870  Progress:  989 on 7870  Progress:  990 on 7870  Progress:  991 on 7870  Progress:  992 on 7870  Progress:  993 on 7870  Progress:  994 on 7870  Progress:  995 on 7870  Progress:  996 on 7870  Progress:  997 on 7870  Progress:  998 on 7870  Progress:  999 on 7870  Progress: 1000 on 7870  Progress: 1001 on 7870  Progress: 1002 on 7870  Progress: 1003 on 7870  Progress: 1004 on 7870  Progress: 1005 on 7870  Progress: 1006 on 7870  Progress: 1007 on 7870  Progress: 1008 on 7870  Progress: 1009 on 7870  Progress: 1010 on 7870  Progress: 1011 on 7870  Progress: 1012 on 7870  Progress: 1013 on 7870  Progress: 1014 on 7870  Progress: 1015 on 7870  Progress: 1016 on 7870  Progress: 1017 on 7870  Progress: 1018 on 7870  Progress: 1019 on 7870  Progress: 1020 on 7870  Progress: 1021 on 7870  Progress: 1022 on 7870  Progress: 1023 on 7870  Progress: 1024 on 7870  Progress: 1025 on 7870  Progress: 1026 on 7870  Progress: 1027 on 7870  Progress: 1028 on 7870  Progress: 1029 on 7870  Progress: 1030 on 7870  Progress: 1031 on 7870  Progress: 1032 on 7870  Progress: 1033 on 7870  Progress: 1034 on 7870  Progress: 1035 on 7870  Progress: 1036 on 7870  Progress: 1037 on 7870  Progress: 1038 on 7870  Progress: 1039 on 7870  Progress: 1040 on 7870  Progress: 1041 on 7870  Progress: 1042 on 7870  Progress: 1043 on 7870  Progress: 1044 on 7870  Progress: 1045 on 7870  Progress: 1046 on 7870  Progress: 1047 on 7870  Progress: 1048 on 7870  Progress: 1049 on 7870  Progress: 1050 on 7870  Progress: 1051 on 7870  Progress: 1052 on 7870  Progress: 1053 on 7870  Progress: 1054 on 7870  Progress: 1055 on 7870  Progress: 1056 on 7870  Progress: 1057 on 7870  Progress: 1058 on 7870  Progress: 1059 on 7870  Progress: 1060 on 7870  Progress: 1061 on 7870  Progress: 1062 on 7870  Progress: 1063 on 7870  Progress: 1064 on 7870  Progress: 1065 on 7870  Progress: 1066 on 7870  Progress: 1067 on 7870  Progress: 1068 on 7870  Progress: 1069 on 7870  Progress: 1070 on 7870  Progress: 1071 on 7870  Progress: 1072 on 7870  Progress: 1073 on 7870  Progress: 1074 on 7870  Progress: 1075 on 7870  Progress: 1076 on 7870  Progress: 1077 on 7870  Progress: 1078 on 7870  Progress: 1079 on 7870  Progress: 1080 on 7870  Progress: 1081 on 7870  Progress: 1082 on 7870  Progress: 1083 on 7870  Progress: 1084 on 7870  Progress: 1085 on 7870  Progress: 1086 on 7870  Progress: 1087 on 7870  Progress: 1088 on 7870  Progress: 1089 on 7870  Progress: 1090 on 7870  Progress: 1091 on 7870  Progress: 1092 on 7870  Progress: 1093 on 7870  Progress: 1094 on 7870  Progress: 1095 on 7870  Progress: 1096 on 7870  Progress: 1097 on 7870  Progress: 1098 on 7870  Progress: 1099 on 7870  Progress: 1100 on 7870  Progress: 1101 on 7870  Progress: 1102 on 7870  Progress: 1103 on 7870  Progress: 1104 on 7870  Progress: 1105 on 7870  Progress: 1106 on 7870  Progress: 1107 on 7870  Progress: 1108 on 7870  Progress: 1109 on 7870  Progress: 1110 on 7870  Progress: 1111 on 7870  Progress: 1112 on 7870  Progress: 1113 on 7870  Progress: 1114 on 7870  Progress: 1115 on 7870  Progress: 1116 on 7870  Progress: 1117 on 7870  Progress: 1118 on 7870  Progress: 1119 on 7870  Progress: 1120 on 7870  Progress: 1121 on 7870  Progress: 1122 on 7870  Progress: 1123 on 7870  Progress: 1124 on 7870  Progress: 1125 on 7870  Progress: 1126 on 7870  Progress: 1127 on 7870  Progress: 1128 on 7870  Progress: 1129 on 7870  Progress: 1130 on 7870  Progress: 1131 on 7870  Progress: 1132 on 7870  Progress: 1133 on 7870  Progress: 1134 on 7870  Progress: 1135 on 7870  Progress: 1136 on 7870  Progress: 1137 on 7870  Progress: 1138 on 7870  Progress: 1139 on 7870  Progress: 1140 on 7870  Progress: 1141 on 7870  Progress: 1142 on 7870  Progress: 1143 on 7870  Progress: 1144 on 7870  Progress: 1145 on 7870  Progress: 1146 on 7870  Progress: 1147 on 7870  Progress: 1148 on 7870  Progress: 1149 on 7870  Progress: 1150 on 7870  Progress: 1151 on 7870  Progress: 1152 on 7870  Progress: 1153 on 7870  Progress: 1154 on 7870  Progress: 1155 on 7870  Progress: 1156 on 7870  Progress: 1157 on 7870  Progress: 1158 on 7870  Progress: 1159 on 7870  Progress: 1160 on 7870  Progress: 1161 on 7870  Progress: 1162 on 7870  Progress: 1163 on 7870  Progress: 1164 on 7870  Progress: 1165 on 7870  Progress: 1166 on 7870  Progress: 1167 on 7870  Progress: 1168 on 7870  Progress: 1169 on 7870  Progress: 1170 on 7870  Progress: 1171 on 7870  Progress: 1172 on 7870  Progress: 1173 on 7870  Progress: 1174 on 7870  Progress: 1175 on 7870  Progress: 1176 on 7870  Progress: 1177 on 7870  Progress: 1178 on 7870  Progress: 1179 on 7870  Progress: 1180 on 7870  Progress: 1181 on 7870  Progress: 1182 on 7870  Progress: 1183 on 7870  Progress: 1184 on 7870  Progress: 1185 on 7870  Progress: 1186 on 7870  Progress: 1187 on 7870  Progress: 1188 on 7870  Progress: 1189 on 7870  Progress: 1190 on 7870  Progress: 1191 on 7870  Progress: 1192 on 7870  Progress: 1193 on 7870  Progress: 1194 on 7870  Progress: 1195 on 7870  Progress: 1196 on 7870  Progress: 1197 on 7870  Progress: 1198 on 7870  Progress: 1199 on 7870  Progress: 1200 on 7870  Progress: 1201 on 7870  Progress: 1202 on 7870  Progress: 1203 on 7870  Progress: 1204 on 7870  Progress: 1205 on 7870  Progress: 1206 on 7870  Progress: 1207 on 7870  Progress: 1208 on 7870  Progress: 1209 on 7870  Progress: 1210 on 7870  Progress: 1211 on 7870  Progress: 1212 on 7870  Progress: 1213 on 7870  Progress: 1214 on 7870  Progress: 1215 on 7870  Progress: 1216 on 7870  Progress: 1217 on 7870  Progress: 1218 on 7870  Progress: 1219 on 7870  Progress: 1220 on 7870  Progress: 1221 on 7870  Progress: 1222 on 7870  Progress: 1223 on 7870  Progress: 1224 on 7870  Progress: 1225 on 7870  Progress: 1226 on 7870  Progress: 1227 on 7870  Progress: 1228 on 7870  Progress: 1229 on 7870  Progress: 1230 on 7870  Progress: 1231 on 7870  Progress: 1232 on 7870  Progress: 1233 on 7870  Progress: 1234 on 7870  Progress: 1235 on 7870  Progress: 1236 on 7870  Progress: 1237 on 7870  Progress: 1238 on 7870  Progress: 1239 on 7870  Progress: 1240 on 7870  Progress: 1241 on 7870  Progress: 1242 on 7870  Progress: 1243 on 7870  Progress: 1244 on 7870  Progress: 1245 on 7870  Progress: 1246 on 7870  Progress: 1247 on 7870  Progress: 1248 on 7870  Progress: 1249 on 7870  Progress: 1250 on 7870  Progress: 1251 on 7870  Progress: 1252 on 7870  Progress: 1253 on 7870  Progress: 1254 on 7870  Progress: 1255 on 7870  Progress: 1256 on 7870  Progress: 1257 on 7870  Progress: 1258 on 7870  Progress: 1259 on 7870  Progress: 1260 on 7870  Progress: 1261 on 7870  Progress: 1262 on 7870  Progress: 1263 on 7870  Progress: 1264 on 7870  Progress: 1265 on 7870  Progress: 1266 on 7870  Progress: 1267 on 7870  Progress: 1268 on 7870  Progress: 1269 on 7870  Progress: 1270 on 7870  Progress: 1271 on 7870  Progress: 1272 on 7870  Progress: 1273 on 7870  Progress: 1274 on 7870  Progress: 1275 on 7870  Progress: 1276 on 7870  Progress: 1277 on 7870  Progress: 1278 on 7870  Progress: 1279 on 7870  Progress: 1280 on 7870  Progress: 1281 on 7870  Progress: 1282 on 7870  Progress: 1283 on 7870  Progress: 1284 on 7870  Progress: 1285 on 7870  Progress: 1286 on 7870  Progress: 1287 on 7870  Progress: 1288 on 7870  Progress: 1289 on 7870  Progress: 1290 on 7870  Progress: 1291 on 7870  Progress: 1292 on 7870  Progress: 1293 on 7870  Progress: 1294 on 7870  Progress: 1295 on 7870  Progress: 1296 on 7870  Progress: 1297 on 7870  Progress: 1298 on 7870  Progress: 1299 on 7870  Progress: 1300 on 7870  Progress: 1301 on 7870  Progress: 1302 on 7870  Progress: 1303 on 7870  Progress: 1304 on 7870  Progress: 1305 on 7870  Progress: 1306 on 7870  Progress: 1307 on 7870  Progress: 1308 on 7870  Progress: 1309 on 7870  Progress: 1310 on 7870  Progress: 1311 on 7870  Progress: 1312 on 7870  Progress: 1313 on 7870  Progress: 1314 on 7870  Progress: 1315 on 7870  Progress: 1316 on 7870  Progress: 1317 on 7870  Progress: 1318 on 7870  Progress: 1319 on 7870  Progress: 1320 on 7870  Progress: 1321 on 7870  Progress: 1322 on 7870  Progress: 1323 on 7870  Progress: 1324 on 7870  Progress: 1325 on 7870  Progress: 1326 on 7870  Progress: 1327 on 7870  Progress: 1328 on 7870  Progress: 1329 on 7870  Progress: 1330 on 7870  Progress: 1331 on 7870  Progress: 1332 on 7870  Progress: 1333 on 7870  Progress: 1334 on 7870  Progress: 1335 on 7870  Progress: 1336 on 7870  Progress: 1337 on 7870  Progress: 1338 on 7870  Progress: 1339 on 7870  Progress: 1340 on 7870  Progress: 1341 on 7870  Progress: 1342 on 7870  Progress: 1343 on 7870  Progress: 1344 on 7870  Progress: 1345 on 7870  Progress: 1346 on 7870  Progress: 1347 on 7870  Progress: 1348 on 7870  Progress: 1349 on 7870  Progress: 1350 on 7870  Progress: 1351 on 7870  Progress: 1352 on 7870  Progress: 1353 on 7870  Progress: 1354 on 7870  Progress: 1355 on 7870  Progress: 1356 on 7870  Progress: 1357 on 7870  Progress: 1358 on 7870  Progress: 1359 on 7870  Progress: 1360 on 7870  Progress: 1361 on 7870  Progress: 1362 on 7870  Progress: 1363 on 7870  Progress: 1364 on 7870  Progress: 1365 on 7870  Progress: 1366 on 7870  Progress: 1367 on 7870  Progress: 1368 on 7870  Progress: 1369 on 7870  Progress: 1370 on 7870  Progress: 1371 on 7870  Progress: 1372 on 7870  Progress: 1373 on 7870  Progress: 1374 on 7870  Progress: 1375 on 7870  Progress: 1376 on 7870  Progress: 1377 on 7870  Progress: 1378 on 7870  Progress: 1379 on 7870  Progress: 1380 on 7870  Progress: 1381 on 7870  Progress: 1382 on 7870  Progress: 1383 on 7870  Progress: 1384 on 7870  Progress: 1385 on 7870  Progress: 1386 on 7870  Progress: 1387 on 7870  Progress: 1388 on 7870  Progress: 1389 on 7870  Progress: 1390 on 7870  Progress: 1391 on 7870  Progress: 1392 on 7870  Progress: 1393 on 7870  Progress: 1394 on 7870  Progress: 1395 on 7870  Progress: 1396 on 7870  Progress: 1397 on 7870  Progress: 1398 on 7870  Progress: 1399 on 7870  Progress: 1400 on 7870  Progress: 1401 on 7870  Progress: 1402 on 7870  Progress: 1403 on 7870  Progress: 1404 on 7870  Progress: 1405 on 7870  Progress: 1406 on 7870  Progress: 1407 on 7870  Progress: 1408 on 7870  Progress: 1409 on 7870  Progress: 1410 on 7870  Progress: 1411 on 7870  Progress: 1412 on 7870  Progress: 1413 on 7870  Progress: 1414 on 7870  Progress: 1415 on 7870  Progress: 1416 on 7870  Progress: 1417 on 7870  Progress: 1418 on 7870  Progress: 1419 on 7870  Progress: 1420 on 7870  Progress: 1421 on 7870  Progress: 1422 on 7870  Progress: 1423 on 7870  Progress: 1424 on 7870  Progress: 1425 on 7870  Progress: 1426 on 7870  Progress: 1427 on 7870  Progress: 1428 on 7870  Progress: 1429 on 7870  Progress: 1430 on 7870  Progress: 1431 on 7870  Progress: 1432 on 7870  Progress: 1433 on 7870  Progress: 1434 on 7870  Progress: 1435 on 7870  Progress: 1436 on 7870  Progress: 1437 on 7870  Progress: 1438 on 7870  Progress: 1439 on 7870  Progress: 1440 on 7870  Progress: 1441 on 7870  Progress: 1442 on 7870  Progress: 1443 on 7870  Progress: 1444 on 7870  Progress: 1445 on 7870  Progress: 1446 on 7870  Progress: 1447 on 7870  Progress: 1448 on 7870  Progress: 1449 on 7870  Progress: 1450 on 7870  Progress: 1451 on 7870  Progress: 1452 on 7870  Progress: 1453 on 7870  Progress: 1454 on 7870  Progress: 1455 on 7870  Progress: 1456 on 7870  Progress: 1457 on 7870  Progress: 1458 on 7870  Progress: 1459 on 7870  Progress: 1460 on 7870  Progress: 1461 on 7870  Progress: 1462 on 7870  Progress: 1463 on 7870  Progress: 1464 on 7870  Progress: 1465 on 7870  Progress: 1466 on 7870  Progress: 1467 on 7870  Progress: 1468 on 7870  Progress: 1469 on 7870  Progress: 1470 on 7870  Progress: 1471 on 7870  Progress: 1472 on 7870  Progress: 1473 on 7870  Progress: 1474 on 7870  Progress: 1475 on 7870  Progress: 1476 on 7870  Progress: 1477 on 7870  Progress: 1478 on 7870  Progress: 1479 on 7870  Progress: 1480 on 7870  Progress: 1481 on 7870  Progress: 1482 on 7870  Progress: 1483 on 7870  Progress: 1484 on 7870  Progress: 1485 on 7870  Progress: 1486 on 7870  Progress: 1487 on 7870  Progress: 1488 on 7870  Progress: 1489 on 7870  Progress: 1490 on 7870  Progress: 1491 on 7870  Progress: 1492 on 7870  Progress: 1493 on 7870  Progress: 1494 on 7870  Progress: 1495 on 7870  Progress: 1496 on 7870  Progress: 1497 on 7870  Progress: 1498 on 7870  Progress: 1499 on 7870  Progress: 1500 on 7870  Progress: 1501 on 7870  Progress: 1502 on 7870  Progress: 1503 on 7870  Progress: 1504 on 7870  Progress: 1505 on 7870  Progress: 1506 on 7870  Progress: 1507 on 7870  Progress: 1508 on 7870  Progress: 1509 on 7870  Progress: 1510 on 7870  Progress: 1511 on 7870  Progress: 1512 on 7870  Progress: 1513 on 7870  Progress: 1514 on 7870  Progress: 1515 on 7870  Progress: 1516 on 7870  Progress: 1517 on 7870  Progress: 1518 on 7870  Progress: 1519 on 7870  Progress: 1520 on 7870  Progress: 1521 on 7870  Progress: 1522 on 7870  Progress: 1523 on 7870  Progress: 1524 on 7870  Progress: 1525 on 7870  Progress: 1526 on 7870  Progress: 1527 on 7870  Progress: 1528 on 7870  Progress: 1529 on 7870  Progress: 1530 on 7870  Progress: 1531 on 7870  Progress: 1532 on 7870  Progress: 1533 on 7870  Progress: 1534 on 7870  Progress: 1535 on 7870  Progress: 1536 on 7870  Progress: 1537 on 7870  Progress: 1538 on 7870  Progress: 1539 on 7870  Progress: 1540 on 7870  Progress: 1541 on 7870  Progress: 1542 on 7870  Progress: 1543 on 7870  Progress: 1544 on 7870  Progress: 1545 on 7870  Progress: 1546 on 7870  Progress: 1547 on 7870  Progress: 1548 on 7870  Progress: 1549 on 7870  Progress: 1550 on 7870  Progress: 1551 on 7870  Progress: 1552 on 7870  Progress: 1553 on 7870  Progress: 1554 on 7870  Progress: 1555 on 7870  Progress: 1556 on 7870  Progress: 1557 on 7870  Progress: 1558 on 7870  Progress: 1559 on 7870  Progress: 1560 on 7870  Progress: 1561 on 7870  Progress: 1562 on 7870  Progress: 1563 on 7870  Progress: 1564 on 7870  Progress: 1565 on 7870  Progress: 1566 on 7870  Progress: 1567 on 7870  Progress: 1568 on 7870  Progress: 1569 on 7870  Progress: 1570 on 7870  Progress: 1571 on 7870  Progress: 1572 on 7870  Progress: 1573 on 7870  Progress: 1574 on 7870  Progress: 1575 on 7870  Progress: 1576 on 7870  Progress: 1577 on 7870  Progress: 1578 on 7870  Progress: 1579 on 7870  Progress: 1580 on 7870  Progress: 1581 on 7870  Progress: 1582 on 7870  Progress: 1583 on 7870  Progress: 1584 on 7870  Progress: 1585 on 7870  Progress: 1586 on 7870  Progress: 1587 on 7870  Progress: 1588 on 7870  Progress: 1589 on 7870  Progress: 1590 on 7870  Progress: 1591 on 7870  Progress: 1592 on 7870  Progress: 1593 on 7870  Progress: 1594 on 7870  Progress: 1595 on 7870  Progress: 1596 on 7870  Progress: 1597 on 7870  Progress: 1598 on 7870  Progress: 1599 on 7870  Progress: 1600 on 7870  Progress: 1601 on 7870  Progress: 1602 on 7870  Progress: 1603 on 7870  Progress: 1604 on 7870  Progress: 1605 on 7870  Progress: 1606 on 7870  Progress: 1607 on 7870  Progress: 1608 on 7870  Progress: 1609 on 7870  Progress: 1610 on 7870  Progress: 1611 on 7870  Progress: 1612 on 7870  Progress: 1613 on 7870  Progress: 1614 on 7870  Progress: 1615 on 7870  Progress: 1616 on 7870  Progress: 1617 on 7870  Progress: 1618 on 7870  Progress: 1619 on 7870  Progress: 1620 on 7870  Progress: 1621 on 7870  Progress: 1622 on 7870  Progress: 1623 on 7870  Progress: 1624 on 7870  Progress: 1625 on 7870  Progress: 1626 on 7870  Progress: 1627 on 7870  Progress: 1628 on 7870  Progress: 1629 on 7870  Progress: 1630 on 7870  Progress: 1631 on 7870  Progress: 1632 on 7870  Progress: 1633 on 7870  Progress: 1634 on 7870  Progress: 1635 on 7870  Progress: 1636 on 7870  Progress: 1637 on 7870  Progress: 1638 on 7870  Progress: 1639 on 7870  Progress: 1640 on 7870  Progress: 1641 on 7870  Progress: 1642 on 7870  Progress: 1643 on 7870  Progress: 1644 on 7870  Progress: 1645 on 7870  Progress: 1646 on 7870  Progress: 1647 on 7870  Progress: 1648 on 7870  Progress: 1649 on 7870  Progress: 1650 on 7870  Progress: 1651 on 7870  Progress: 1652 on 7870  Progress: 1653 on 7870  Progress: 1654 on 7870  Progress: 1655 on 7870  Progress: 1656 on 7870  Progress: 1657 on 7870  Progress: 1658 on 7870  Progress: 1659 on 7870  Progress: 1660 on 7870  Progress: 1661 on 7870  Progress: 1662 on 7870  Progress: 1663 on 7870  Progress: 1664 on 7870  Progress: 1665 on 7870  Progress: 1666 on 7870  Progress: 1667 on 7870  Progress: 1668 on 7870  Progress: 1669 on 7870  Progress: 1670 on 7870  Progress: 1671 on 7870  Progress: 1672 on 7870  Progress: 1673 on 7870  Progress: 1674 on 7870  Progress: 1675 on 7870  Progress: 1676 on 7870  Progress: 1677 on 7870  Progress: 1678 on 7870  Progress: 1679 on 7870  Progress: 1680 on 7870  Progress: 1681 on 7870  Progress: 1682 on 7870  Progress: 1683 on 7870  Progress: 1684 on 7870  Progress: 1685 on 7870  Progress: 1686 on 7870  Progress: 1687 on 7870  Progress: 1688 on 7870  Progress: 1689 on 7870  Progress: 1690 on 7870  Progress: 1691 on 7870  Progress: 1692 on 7870  Progress: 1693 on 7870  Progress: 1694 on 7870  Progress: 1695 on 7870  Progress: 1696 on 7870  Progress: 1697 on 7870  Progress: 1698 on 7870  Progress: 1699 on 7870  Progress: 1700 on 7870  Progress: 1701 on 7870  Progress: 1702 on 7870  Progress: 1703 on 7870  Progress: 1704 on 7870  Progress: 1705 on 7870  Progress: 1706 on 7870  Progress: 1707 on 7870  Progress: 1708 on 7870  Progress: 1709 on 7870  Progress: 1710 on 7870  Progress: 1711 on 7870  Progress: 1712 on 7870  Progress: 1713 on 7870  Progress: 1714 on 7870  Progress: 1715 on 7870  Progress: 1716 on 7870  Progress: 1717 on 7870  Progress: 1718 on 7870  Progress: 1719 on 7870  Progress: 1720 on 7870  Progress: 1721 on 7870  Progress: 1722 on 7870  Progress: 1723 on 7870  Progress: 1724 on 7870  Progress: 1725 on 7870  Progress: 1726 on 7870  Progress: 1727 on 7870  Progress: 1728 on 7870  Progress: 1729 on 7870  Progress: 1730 on 7870  Progress: 1731 on 7870  Progress: 1732 on 7870  Progress: 1733 on 7870  Progress: 1734 on 7870  Progress: 1735 on 7870  Progress: 1736 on 7870  Progress: 1737 on 7870  Progress: 1738 on 7870  Progress: 1739 on 7870  Progress: 1740 on 7870  Progress: 1741 on 7870  Progress: 1742 on 7870  Progress: 1743 on 7870  Progress: 1744 on 7870  Progress: 1745 on 7870  Progress: 1746 on 7870  Progress: 1747 on 7870  Progress: 1748 on 7870  Progress: 1749 on 7870  Progress: 1750 on 7870  Progress: 1751 on 7870  Progress: 1752 on 7870  Progress: 1753 on 7870  Progress: 1754 on 7870  Progress: 1755 on 7870  Progress: 1756 on 7870  Progress: 1757 on 7870  Progress: 1758 on 7870  Progress: 1759 on 7870  Progress: 1760 on 7870  Progress: 1761 on 7870  Progress: 1762 on 7870  Progress: 1763 on 7870  Progress: 1764 on 7870  Progress: 1765 on 7870  Progress: 1766 on 7870  Progress: 1767 on 7870  Progress: 1768 on 7870  Progress: 1769 on 7870  Progress: 1770 on 7870  Progress: 1771 on 7870  Progress: 1772 on 7870  Progress: 1773 on 7870  Progress: 1774 on 7870  Progress: 1775 on 7870  Progress: 1776 on 7870  Progress: 1777 on 7870  Progress: 1778 on 7870  Progress: 1779 on 7870  Progress: 1780 on 7870  Progress: 1781 on 7870  Progress: 1782 on 7870  Progress: 1783 on 7870  Progress: 1784 on 7870  Progress: 1785 on 7870  Progress: 1786 on 7870  Progress: 1787 on 7870  Progress: 1788 on 7870  Progress: 1789 on 7870  Progress: 1790 on 7870  Progress: 1791 on 7870  Progress: 1792 on 7870  Progress: 1793 on 7870  Progress: 1794 on 7870  Progress: 1795 on 7870  Progress: 1796 on 7870  Progress: 1797 on 7870  Progress: 1798 on 7870  Progress: 1799 on 7870  Progress: 1800 on 7870  Progress: 1801 on 7870  Progress: 1802 on 7870  Progress: 1803 on 7870  Progress: 1804 on 7870  Progress: 1805 on 7870  Progress: 1806 on 7870  Progress: 1807 on 7870  Progress: 1808 on 7870  Progress: 1809 on 7870  Progress: 1810 on 7870  Progress: 1811 on 7870  Progress: 1812 on 7870  Progress: 1813 on 7870  Progress: 1814 on 7870  Progress: 1815 on 7870  Progress: 1816 on 7870  Progress: 1817 on 7870  Progress: 1818 on 7870  Progress: 1819 on 7870  Progress: 1820 on 7870  Progress: 1821 on 7870  Progress: 1822 on 7870  Progress: 1823 on 7870  Progress: 1824 on 7870  Progress: 1825 on 7870  Progress: 1826 on 7870  Progress: 1827 on 7870  Progress: 1828 on 7870  Progress: 1829 on 7870  Progress: 1830 on 7870  Progress: 1831 on 7870  Progress: 1832 on 7870  Progress: 1833 on 7870  Progress: 1834 on 7870  Progress: 1835 on 7870  Progress: 1836 on 7870  Progress: 1837 on 7870  Progress: 1838 on 7870  Progress: 1839 on 7870  Progress: 1840 on 7870  Progress: 1841 on 7870  Progress: 1842 on 7870  Progress: 1843 on 7870  Progress: 1844 on 7870  Progress: 1845 on 7870  Progress: 1846 on 7870  Progress: 1847 on 7870  Progress: 1848 on 7870  Progress: 1849 on 7870  Progress: 1850 on 7870  Progress: 1851 on 7870  Progress: 1852 on 7870  Progress: 1853 on 7870  Progress: 1854 on 7870  Progress: 1855 on 7870  Progress: 1856 on 7870  Progress: 1857 on 7870  Progress: 1858 on 7870  Progress: 1859 on 7870  Progress: 1860 on 7870  Progress: 1861 on 7870  Progress: 1862 on 7870  Progress: 1863 on 7870  Progress: 1864 on 7870  Progress: 1865 on 7870  Progress: 1866 on 7870  Progress: 1867 on 7870  Progress: 1868 on 7870  Progress: 1869 on 7870  Progress: 1870 on 7870  Progress: 1871 on 7870  Progress: 1872 on 7870  Progress: 1873 on 7870  Progress: 1874 on 7870  Progress: 1875 on 7870  Progress: 1876 on 7870  Progress: 1877 on 7870  Progress: 1878 on 7870  Progress: 1879 on 7870  Progress: 1880 on 7870  Progress: 1881 on 7870  Progress: 1882 on 7870  Progress: 1883 on 7870  Progress: 1884 on 7870  Progress: 1885 on 7870  Progress: 1886 on 7870  Progress: 1887 on 7870  Progress: 1888 on 7870  Progress: 1889 on 7870  Progress: 1890 on 7870  Progress: 1891 on 7870  Progress: 1892 on 7870  Progress: 1893 on 7870  Progress: 1894 on 7870  Progress: 1895 on 7870  Progress: 1896 on 7870  Progress: 1897 on 7870  Progress: 1898 on 7870  Progress: 1899 on 7870  Progress: 1900 on 7870  Progress: 1901 on 7870  Progress: 1902 on 7870  Progress: 1903 on 7870  Progress: 1904 on 7870  Progress: 1905 on 7870  Progress: 1906 on 7870  Progress: 1907 on 7870  Progress: 1908 on 7870  Progress: 1909 on 7870  Progress: 1910 on 7870  Progress: 1911 on 7870  Progress: 1912 on 7870  Progress: 1913 on 7870  Progress: 1914 on 7870  Progress: 1915 on 7870  Progress: 1916 on 7870  Progress: 1917 on 7870  Progress: 1918 on 7870  Progress: 1919 on 7870  Progress: 1920 on 7870  Progress: 1921 on 7870  Progress: 1922 on 7870  Progress: 1923 on 7870  Progress: 1924 on 7870  Progress: 1925 on 7870  Progress: 1926 on 7870  Progress: 1927 on 7870  Progress: 1928 on 7870  Progress: 1929 on 7870  Progress: 1930 on 7870  Progress: 1931 on 7870  Progress: 1932 on 7870  Progress: 1933 on 7870  Progress: 1934 on 7870  Progress: 1935 on 7870  Progress: 1936 on 7870  Progress: 1937 on 7870  Progress: 1938 on 7870  Progress: 1939 on 7870  Progress: 1940 on 7870  Progress: 1941 on 7870  Progress: 1942 on 7870  Progress: 1943 on 7870  Progress: 1944 on 7870  Progress: 1945 on 7870  Progress: 1946 on 7870  Progress: 1947 on 7870  Progress: 1948 on 7870  Progress: 1949 on 7870  Progress: 1950 on 7870  Progress: 1951 on 7870  Progress: 1952 on 7870  Progress: 1953 on 7870  Progress: 1954 on 7870  Progress: 1955 on 7870  Progress: 1956 on 7870  Progress: 1957 on 7870  Progress: 1958 on 7870  Progress: 1959 on 7870  Progress: 1960 on 7870  Progress: 1961 on 7870  Progress: 1962 on 7870  Progress: 1963 on 7870  Progress: 1964 on 7870  Progress: 1965 on 7870  Progress: 1966 on 7870  Progress: 1967 on 7870  Progress: 1968 on 7870  Progress: 1969 on 7870  Progress: 1970 on 7870  Progress: 1971 on 7870  Progress: 1972 on 7870  Progress: 1973 on 7870  Progress: 1974 on 7870  Progress: 1975 on 7870  Progress: 1976 on 7870  Progress: 1977 on 7870  Progress: 1978 on 7870  Progress: 1979 on 7870  Progress: 1980 on 7870  Progress: 1981 on 7870  Progress: 1982 on 7870  Progress: 1983 on 7870  Progress: 1984 on 7870  Progress: 1985 on 7870  Progress: 1986 on 7870  Progress: 1987 on 7870  Progress: 1988 on 7870  Progress: 1989 on 7870  Progress: 1990 on 7870  Progress: 1991 on 7870  Progress: 1992 on 7870  Progress: 1993 on 7870  Progress: 1994 on 7870  Progress: 1995 on 7870  Progress: 1996 on 7870  Progress: 1997 on 7870  Progress: 1998 on 7870  Progress: 1999 on 7870  Progress: 2000 on 7870  Progress: 2001 on 7870  Progress: 2002 on 7870  Progress: 2003 on 7870  Progress: 2004 on 7870  Progress: 2005 on 7870  Progress: 2006 on 7870  Progress: 2007 on 7870  Progress: 2008 on 7870  Progress: 2009 on 7870  Progress: 2010 on 7870  Progress: 2011 on 7870  Progress: 2012 on 7870  Progress: 2013 on 7870  Progress: 2014 on 7870  Progress: 2015 on 7870  Progress: 2016 on 7870  Progress: 2017 on 7870  Progress: 2018 on 7870  Progress: 2019 on 7870  Progress: 2020 on 7870  Progress: 2021 on 7870  Progress: 2022 on 7870  Progress: 2023 on 7870  Progress: 2024 on 7870  Progress: 2025 on 7870  Progress: 2026 on 7870  Progress: 2027 on 7870  Progress: 2028 on 7870  Progress: 2029 on 7870  Progress: 2030 on 7870  Progress: 2031 on 7870  Progress: 2032 on 7870  Progress: 2033 on 7870  Progress: 2034 on 7870  Progress: 2035 on 7870  Progress: 2036 on 7870  Progress: 2037 on 7870  Progress: 2038 on 7870  Progress: 2039 on 7870  Progress: 2040 on 7870  Progress: 2041 on 7870  Progress: 2042 on 7870  Progress: 2043 on 7870  Progress: 2044 on 7870  Progress: 2045 on 7870  Progress: 2046 on 7870  Progress: 2047 on 7870  Progress: 2048 on 7870  Progress: 2049 on 7870  Progress: 2050 on 7870  Progress: 2051 on 7870  Progress: 2052 on 7870  Progress: 2053 on 7870  Progress: 2054 on 7870  Progress: 2055 on 7870  Progress: 2056 on 7870  Progress: 2057 on 7870  Progress: 2058 on 7870  Progress: 2059 on 7870  Progress: 2060 on 7870  Progress: 2061 on 7870  Progress: 2062 on 7870  Progress: 2063 on 7870  Progress: 2064 on 7870  Progress: 2065 on 7870  Progress: 2066 on 7870  Progress: 2067 on 7870  Progress: 2068 on 7870  Progress: 2069 on 7870  Progress: 2070 on 7870  Progress: 2071 on 7870  Progress: 2072 on 7870  Progress: 2073 on 7870  Progress: 2074 on 7870  Progress: 2075 on 7870  Progress: 2076 on 7870  Progress: 2077 on 7870  Progress: 2078 on 7870  Progress: 2079 on 7870  Progress: 2080 on 7870  Progress: 2081 on 7870  Progress: 2082 on 7870  Progress: 2083 on 7870  Progress: 2084 on 7870  Progress: 2085 on 7870  Progress: 2086 on 7870  Progress: 2087 on 7870  Progress: 2088 on 7870  Progress: 2089 on 7870  Progress: 2090 on 7870  Progress: 2091 on 7870  Progress: 2092 on 7870  Progress: 2093 on 7870  Progress: 2094 on 7870  Progress: 2095 on 7870  Progress: 2096 on 7870  Progress: 2097 on 7870  Progress: 2098 on 7870  Progress: 2099 on 7870  Progress: 2100 on 7870  Progress: 2101 on 7870  Progress: 2102 on 7870  Progress: 2103 on 7870  Progress: 2104 on 7870  Progress: 2105 on 7870  Progress: 2106 on 7870  Progress: 2107 on 7870  Progress: 2108 on 7870  Progress: 2109 on 7870  Progress: 2110 on 7870  Progress: 2111 on 7870  Progress: 2112 on 7870  Progress: 2113 on 7870  Progress: 2114 on 7870  Progress: 2115 on 7870  Progress: 2116 on 7870  Progress: 2117 on 7870  Progress: 2118 on 7870  Progress: 2119 on 7870  Progress: 2120 on 7870  Progress: 2121 on 7870  Progress: 2122 on 7870  Progress: 2123 on 7870  Progress: 2124 on 7870  Progress: 2125 on 7870  Progress: 2126 on 7870  Progress: 2127 on 7870  Progress: 2128 on 7870  Progress: 2129 on 7870  Progress: 2130 on 7870  Progress: 2131 on 7870  Progress: 2132 on 7870  Progress: 2133 on 7870  Progress: 2134 on 7870  Progress: 2135 on 7870  Progress: 2136 on 7870  Progress: 2137 on 7870  Progress: 2138 on 7870  Progress: 2139 on 7870  Progress: 2140 on 7870  Progress: 2141 on 7870  Progress: 2142 on 7870  Progress: 2143 on 7870  Progress: 2144 on 7870  Progress: 2145 on 7870  Progress: 2146 on 7870  Progress: 2147 on 7870  Progress: 2148 on 7870  Progress: 2149 on 7870  Progress: 2150 on 7870  Progress: 2151 on 7870  Progress: 2152 on 7870  Progress: 2153 on 7870  Progress: 2154 on 7870  Progress: 2155 on 7870  Progress: 2156 on 7870  Progress: 2157 on 7870  Progress: 2158 on 7870  Progress: 2159 on 7870  Progress: 2160 on 7870  Progress: 2161 on 7870  Progress: 2162 on 7870  Progress: 2163 on 7870  Progress: 2164 on 7870  Progress: 2165 on 7870  Progress: 2166 on 7870  Progress: 2167 on 7870  Progress: 2168 on 7870  Progress: 2169 on 7870  Progress: 2170 on 7870  Progress: 2171 on 7870  Progress: 2172 on 7870  Progress: 2173 on 7870  Progress: 2174 on 7870  Progress: 2175 on 7870  Progress: 2176 on 7870  Progress: 2177 on 7870  Progress: 2178 on 7870  Progress: 2179 on 7870  Progress: 2180 on 7870  Progress: 2181 on 7870  Progress: 2182 on 7870  Progress: 2183 on 7870  Progress: 2184 on 7870  Progress: 2185 on 7870  Progress: 2186 on 7870  Progress: 2187 on 7870  Progress: 2188 on 7870  Progress: 2189 on 7870  Progress: 2190 on 7870  Progress: 2191 on 7870  Progress: 2192 on 7870  Progress: 2193 on 7870  Progress: 2194 on 7870  Progress: 2195 on 7870  Progress: 2196 on 7870  Progress: 2197 on 7870  Progress: 2198 on 7870  Progress: 2199 on 7870  Progress: 2200 on 7870  Progress: 2201 on 7870  Progress: 2202 on 7870  Progress: 2203 on 7870  Progress: 2204 on 7870  Progress: 2205 on 7870  Progress: 2206 on 7870  Progress: 2207 on 7870  Progress: 2208 on 7870  Progress: 2209 on 7870  Progress: 2210 on 7870  Progress: 2211 on 7870  Progress: 2212 on 7870  Progress: 2213 on 7870  Progress: 2214 on 7870  Progress: 2215 on 7870  Progress: 2216 on 7870  Progress: 2217 on 7870  Progress: 2218 on 7870  Progress: 2219 on 7870  Progress: 2220 on 7870  Progress: 2221 on 7870  Progress: 2222 on 7870  Progress: 2223 on 7870  Progress: 2224 on 7870  Progress: 2225 on 7870  Progress: 2226 on 7870  Progress: 2227 on 7870  Progress: 2228 on 7870  Progress: 2229 on 7870  Progress: 2230 on 7870  Progress: 2231 on 7870  Progress: 2232 on 7870  Progress: 2233 on 7870  Progress: 2234 on 7870  Progress: 2235 on 7870  Progress: 2236 on 7870  Progress: 2237 on 7870  Progress: 2238 on 7870  Progress: 2239 on 7870  Progress: 2240 on 7870  Progress: 2241 on 7870  Progress: 2242 on 7870  Progress: 2243 on 7870  Progress: 2244 on 7870  Progress: 2245 on 7870  Progress: 2246 on 7870  Progress: 2247 on 7870  Progress: 2248 on 7870  Progress: 2249 on 7870  Progress: 2250 on 7870  Progress: 2251 on 7870  Progress: 2252 on 7870  Progress: 2253 on 7870  Progress: 2254 on 7870  Progress: 2255 on 7870  Progress: 2256 on 7870  Progress: 2257 on 7870  Progress: 2258 on 7870  Progress: 2259 on 7870  Progress: 2260 on 7870  Progress: 2261 on 7870  Progress: 2262 on 7870  Progress: 2263 on 7870  Progress: 2264 on 7870  Progress: 2265 on 7870  Progress: 2266 on 7870  Progress: 2267 on 7870  Progress: 2268 on 7870  Progress: 2269 on 7870  Progress: 2270 on 7870  Progress: 2271 on 7870  Progress: 2272 on 7870  Progress: 2273 on 7870  Progress: 2274 on 7870  Progress: 2275 on 7870  Progress: 2276 on 7870  Progress: 2277 on 7870  Progress: 2278 on 7870  Progress: 2279 on 7870  Progress: 2280 on 7870  Progress: 2281 on 7870  Progress: 2282 on 7870  Progress: 2283 on 7870  Progress: 2284 on 7870  Progress: 2285 on 7870  Progress: 2286 on 7870  Progress: 2287 on 7870  Progress: 2288 on 7870  Progress: 2289 on 7870  Progress: 2290 on 7870  Progress: 2291 on 7870  Progress: 2292 on 7870  Progress: 2293 on 7870  Progress: 2294 on 7870  Progress: 2295 on 7870  Progress: 2296 on 7870  Progress: 2297 on 7870  Progress: 2298 on 7870  Progress: 2299 on 7870  Progress: 2300 on 7870  Progress: 2301 on 7870  Progress: 2302 on 7870  Progress: 2303 on 7870  Progress: 2304 on 7870  Progress: 2305 on 7870  Progress: 2306 on 7870  Progress: 2307 on 7870  Progress: 2308 on 7870  Progress: 2309 on 7870  Progress: 2310 on 7870  Progress: 2311 on 7870  Progress: 2312 on 7870  Progress: 2313 on 7870  Progress: 2314 on 7870  Progress: 2315 on 7870  Progress: 2316 on 7870  Progress: 2317 on 7870  Progress: 2318 on 7870  Progress: 2319 on 7870  Progress: 2320 on 7870  Progress: 2321 on 7870  Progress: 2322 on 7870  Progress: 2323 on 7870  Progress: 2324 on 7870  Progress: 2325 on 7870  Progress: 2326 on 7870  Progress: 2327 on 7870  Progress: 2328 on 7870  Progress: 2329 on 7870  Progress: 2330 on 7870  Progress: 2331 on 7870  Progress: 2332 on 7870  Progress: 2333 on 7870  Progress: 2334 on 7870  Progress: 2335 on 7870  Progress: 2336 on 7870  Progress: 2337 on 7870  Progress: 2338 on 7870  Progress: 2339 on 7870  Progress: 2340 on 7870  Progress: 2341 on 7870  Progress: 2342 on 7870  Progress: 2343 on 7870  Progress: 2344 on 7870  Progress: 2345 on 7870  Progress: 2346 on 7870  Progress: 2347 on 7870  Progress: 2348 on 7870  Progress: 2349 on 7870  Progress: 2350 on 7870  Progress: 2351 on 7870  Progress: 2352 on 7870  Progress: 2353 on 7870  Progress: 2354 on 7870  Progress: 2355 on 7870  Progress: 2356 on 7870  Progress: 2357 on 7870  Progress: 2358 on 7870  Progress: 2359 on 7870  Progress: 2360 on 7870  Progress: 2361 on 7870  Progress: 2362 on 7870  Progress: 2363 on 7870  Progress: 2364 on 7870  Progress: 2365 on 7870  Progress: 2366 on 7870  Progress: 2367 on 7870  Progress: 2368 on 7870  Progress: 2369 on 7870  Progress: 2370 on 7870  Progress: 2371 on 7870  Progress: 2372 on 7870  Progress: 2373 on 7870  Progress: 2374 on 7870  Progress: 2375 on 7870  Progress: 2376 on 7870  Progress: 2377 on 7870  Progress: 2378 on 7870  Progress: 2379 on 7870  Progress: 2380 on 7870  Progress: 2381 on 7870  Progress: 2382 on 7870  Progress: 2383 on 7870  Progress: 2384 on 7870  Progress: 2385 on 7870  Progress: 2386 on 7870  Progress: 2387 on 7870  Progress: 2388 on 7870  Progress: 2389 on 7870  Progress: 2390 on 7870  Progress: 2391 on 7870  Progress: 2392 on 7870  Progress: 2393 on 7870  Progress: 2394 on 7870  Progress: 2395 on 7870  Progress: 2396 on 7870  Progress: 2397 on 7870  Progress: 2398 on 7870  Progress: 2399 on 7870  Progress: 2400 on 7870  Progress: 2401 on 7870  Progress: 2402 on 7870  Progress: 2403 on 7870  Progress: 2404 on 7870  Progress: 2405 on 7870  Progress: 2406 on 7870  Progress: 2407 on 7870  Progress: 2408 on 7870  Progress: 2409 on 7870  Progress: 2410 on 7870  Progress: 2411 on 7870  Progress: 2412 on 7870  Progress: 2413 on 7870  Progress: 2414 on 7870  Progress: 2415 on 7870  Progress: 2416 on 7870  Progress: 2417 on 7870  Progress: 2418 on 7870  Progress: 2419 on 7870  Progress: 2420 on 7870  Progress: 2421 on 7870  Progress: 2422 on 7870  Progress: 2423 on 7870  Progress: 2424 on 7870  Progress: 2425 on 7870  Progress: 2426 on 7870  Progress: 2427 on 7870  Progress: 2428 on 7870  Progress: 2429 on 7870  Progress: 2430 on 7870  Progress: 2431 on 7870  Progress: 2432 on 7870  Progress: 2433 on 7870  Progress: 2434 on 7870  Progress: 2435 on 7870  Progress: 2436 on 7870  Progress: 2437 on 7870  Progress: 2438 on 7870  Progress: 2439 on 7870  Progress: 2440 on 7870  Progress: 2441 on 7870  Progress: 2442 on 7870  Progress: 2443 on 7870  Progress: 2444 on 7870  Progress: 2445 on 7870  Progress: 2446 on 7870  Progress: 2447 on 7870  Progress: 2448 on 7870  Progress: 2449 on 7870  Progress: 2450 on 7870  Progress: 2451 on 7870  Progress: 2452 on 7870  Progress: 2453 on 7870  Progress: 2454 on 7870  Progress: 2455 on 7870  Progress: 2456 on 7870  Progress: 2457 on 7870  Progress: 2458 on 7870  Progress: 2459 on 7870  Progress: 2460 on 7870  Progress: 2461 on 7870  Progress: 2462 on 7870  Progress: 2463 on 7870  Progress: 2464 on 7870  Progress: 2465 on 7870  Progress: 2466 on 7870  Progress: 2467 on 7870  Progress: 2468 on 7870  Progress: 2469 on 7870  Progress: 2470 on 7870  Progress: 2471 on 7870  Progress: 2472 on 7870  Progress: 2473 on 7870  Progress: 2474 on 7870  Progress: 2475 on 7870  Progress: 2476 on 7870  Progress: 2477 on 7870  Progress: 2478 on 7870  Progress: 2479 on 7870  Progress: 2480 on 7870  Progress: 2481 on 7870  Progress: 2482 on 7870  Progress: 2483 on 7870  Progress: 2484 on 7870  Progress: 2485 on 7870  Progress: 2486 on 7870  Progress: 2487 on 7870  Progress: 2488 on 7870  Progress: 2489 on 7870  Progress: 2490 on 7870  Progress: 2491 on 7870  Progress: 2492 on 7870  Progress: 2493 on 7870  Progress: 2494 on 7870  Progress: 2495 on 7870  Progress: 2496 on 7870  Progress: 2497 on 7870  Progress: 2498 on 7870  Progress: 2499 on 7870  Progress: 2500 on 7870  Progress: 2501 on 7870  Progress: 2502 on 7870  Progress: 2503 on 7870  Progress: 2504 on 7870  Progress: 2505 on 7870  Progress: 2506 on 7870  Progress: 2507 on 7870  Progress: 2508 on 7870  Progress: 2509 on 7870  Progress: 2510 on 7870  Progress: 2511 on 7870  Progress: 2512 on 7870  Progress: 2513 on 7870  Progress: 2514 on 7870  Progress: 2515 on 7870  Progress: 2516 on 7870  Progress: 2517 on 7870  Progress: 2518 on 7870  Progress: 2519 on 7870  Progress: 2520 on 7870  Progress: 2521 on 7870  Progress: 2522 on 7870  Progress: 2523 on 7870  Progress: 2524 on 7870  Progress: 2525 on 7870  Progress: 2526 on 7870  Progress: 2527 on 7870  Progress: 2528 on 7870  Progress: 2529 on 7870  Progress: 2530 on 7870  Progress: 2531 on 7870  Progress: 2532 on 7870  Progress: 2533 on 7870  Progress: 2534 on 7870  Progress: 2535 on 7870  Progress: 2536 on 7870  Progress: 2537 on 7870  Progress: 2538 on 7870  Progress: 2539 on 7870  Progress: 2540 on 7870  Progress: 2541 on 7870  Progress: 2542 on 7870  Progress: 2543 on 7870  Progress: 2544 on 7870  Progress: 2545 on 7870  Progress: 2546 on 7870  Progress: 2547 on 7870  Progress: 2548 on 7870  Progress: 2549 on 7870  Progress: 2550 on 7870  Progress: 2551 on 7870  Progress: 2552 on 7870  Progress: 2553 on 7870  Progress: 2554 on 7870  Progress: 2555 on 7870  Progress: 2556 on 7870  Progress: 2557 on 7870  Progress: 2558 on 7870  Progress: 2559 on 7870  Progress: 2560 on 7870  Progress: 2561 on 7870  Progress: 2562 on 7870  Progress: 2563 on 7870  Progress: 2564 on 7870  Progress: 2565 on 7870  Progress: 2566 on 7870  Progress: 2567 on 7870  Progress: 2568 on 7870  Progress: 2569 on 7870  Progress: 2570 on 7870  Progress: 2571 on 7870  Progress: 2572 on 7870  Progress: 2573 on 7870  Progress: 2574 on 7870  Progress: 2575 on 7870  Progress: 2576 on 7870  Progress: 2577 on 7870  Progress: 2578 on 7870  Progress: 2579 on 7870  Progress: 2580 on 7870  Progress: 2581 on 7870  Progress: 2582 on 7870  Progress: 2583 on 7870  Progress: 2584 on 7870  Progress: 2585 on 7870  Progress: 2586 on 7870  Progress: 2587 on 7870  Progress: 2588 on 7870  Progress: 2589 on 7870  Progress: 2590 on 7870  Progress: 2591 on 7870  Progress: 2592 on 7870  Progress: 2593 on 7870  Progress: 2594 on 7870  Progress: 2595 on 7870  Progress: 2596 on 7870  Progress: 2597 on 7870  Progress: 2598 on 7870  Progress: 2599 on 7870  Progress: 2600 on 7870  Progress: 2601 on 7870  Progress: 2602 on 7870  Progress: 2603 on 7870  Progress: 2604 on 7870  Progress: 2605 on 7870  Progress: 2606 on 7870  Progress: 2607 on 7870  Progress: 2608 on 7870  Progress: 2609 on 7870  Progress: 2610 on 7870  Progress: 2611 on 7870  Progress: 2612 on 7870  Progress: 2613 on 7870  Progress: 2614 on 7870  Progress: 2615 on 7870  Progress: 2616 on 7870  Progress: 2617 on 7870  Progress: 2618 on 7870  Progress: 2619 on 7870  Progress: 2620 on 7870  Progress: 2621 on 7870  Progress: 2622 on 7870  Progress: 2623 on 7870  Progress: 2624 on 7870  Progress: 2625 on 7870  Progress: 2626 on 7870  Progress: 2627 on 7870  Progress: 2628 on 7870  Progress: 2629 on 7870  Progress: 2630 on 7870  Progress: 2631 on 7870  Progress: 2632 on 7870  Progress: 2633 on 7870  Progress: 2634 on 7870  Progress: 2635 on 7870  Progress: 2636 on 7870  Progress: 2637 on 7870  Progress: 2638 on 7870  Progress: 2639 on 7870  Progress: 2640 on 7870  Progress: 2641 on 7870  Progress: 2642 on 7870  Progress: 2643 on 7870  Progress: 2644 on 7870  Progress: 2645 on 7870  Progress: 2646 on 7870  Progress: 2647 on 7870  Progress: 2648 on 7870  Progress: 2649 on 7870  Progress: 2650 on 7870  Progress: 2651 on 7870  Progress: 2652 on 7870  Progress: 2653 on 7870  Progress: 2654 on 7870  Progress: 2655 on 7870  Progress: 2656 on 7870  Progress: 2657 on 7870  Progress: 2658 on 7870  Progress: 2659 on 7870  Progress: 2660 on 7870  Progress: 2661 on 7870  Progress: 2662 on 7870  Progress: 2663 on 7870  Progress: 2664 on 7870  Progress: 2665 on 7870  Progress: 2666 on 7870  Progress: 2667 on 7870  Progress: 2668 on 7870  Progress: 2669 on 7870  Progress: 2670 on 7870  Progress: 2671 on 7870  Progress: 2672 on 7870  Progress: 2673 on 7870  Progress: 2674 on 7870  Progress: 2675 on 7870  Progress: 2676 on 7870  Progress: 2677 on 7870  Progress: 2678 on 7870  Progress: 2679 on 7870  Progress: 2680 on 7870  Progress: 2681 on 7870  Progress: 2682 on 7870  Progress: 2683 on 7870  Progress: 2684 on 7870  Progress: 2685 on 7870  Progress: 2686 on 7870  Progress: 2687 on 7870  Progress: 2688 on 7870  Progress: 2689 on 7870  Progress: 2690 on 7870  Progress: 2691 on 7870  Progress: 2692 on 7870  Progress: 2693 on 7870  Progress: 2694 on 7870  Progress: 2695 on 7870  Progress: 2696 on 7870  Progress: 2697 on 7870  Progress: 2698 on 7870  Progress: 2699 on 7870  Progress: 2700 on 7870  Progress: 2701 on 7870  Progress: 2702 on 7870  Progress: 2703 on 7870  Progress: 2704 on 7870  Progress: 2705 on 7870  Progress: 2706 on 7870  Progress: 2707 on 7870  Progress: 2708 on 7870  Progress: 2709 on 7870  Progress: 2710 on 7870  Progress: 2711 on 7870  Progress: 2712 on 7870  Progress: 2713 on 7870  Progress: 2714 on 7870  Progress: 2715 on 7870  Progress: 2716 on 7870  Progress: 2717 on 7870  Progress: 2718 on 7870  Progress: 2719 on 7870  Progress: 2720 on 7870  Progress: 2721 on 7870  Progress: 2722 on 7870  Progress: 2723 on 7870  Progress: 2724 on 7870  Progress: 2725 on 7870  Progress: 2726 on 7870  Progress: 2727 on 7870  Progress: 2728 on 7870  Progress: 2729 on 7870  Progress: 2730 on 7870  Progress: 2731 on 7870  Progress: 2732 on 7870  Progress: 2733 on 7870  Progress: 2734 on 7870  Progress: 2735 on 7870  Progress: 2736 on 7870  Progress: 2737 on 7870  Progress: 2738 on 7870  Progress: 2739 on 7870  Progress: 2740 on 7870  Progress: 2741 on 7870  Progress: 2742 on 7870  Progress: 2743 on 7870  Progress: 2744 on 7870  Progress: 2745 on 7870  Progress: 2746 on 7870  Progress: 2747 on 7870  Progress: 2748 on 7870  Progress: 2749 on 7870  Progress: 2750 on 7870  Progress: 2751 on 7870  Progress: 2752 on 7870  Progress: 2753 on 7870  Progress: 2754 on 7870  Progress: 2755 on 7870  Progress: 2756 on 7870  Progress: 2757 on 7870  Progress: 2758 on 7870  Progress: 2759 on 7870  Progress: 2760 on 7870  Progress: 2761 on 7870  Progress: 2762 on 7870  Progress: 2763 on 7870  Progress: 2764 on 7870  Progress: 2765 on 7870  Progress: 2766 on 7870  Progress: 2767 on 7870  Progress: 2768 on 7870  Progress: 2769 on 7870  Progress: 2770 on 7870  Progress: 2771 on 7870  Progress: 2772 on 7870  Progress: 2773 on 7870  Progress: 2774 on 7870  Progress: 2775 on 7870  Progress: 2776 on 7870  Progress: 2777 on 7870  Progress: 2778 on 7870  Progress: 2779 on 7870  Progress: 2780 on 7870  Progress: 2781 on 7870  Progress: 2782 on 7870  Progress: 2783 on 7870  Progress: 2784 on 7870  Progress: 2785 on 7870  Progress: 2786 on 7870  Progress: 2787 on 7870  Progress: 2788 on 7870  Progress: 2789 on 7870  Progress: 2790 on 7870  Progress: 2791 on 7870  Progress: 2792 on 7870  Progress: 2793 on 7870  Progress: 2794 on 7870  Progress: 2795 on 7870  Progress: 2796 on 7870  Progress: 2797 on 7870  Progress: 2798 on 7870  Progress: 2799 on 7870  Progress: 2800 on 7870  Progress: 2801 on 7870  Progress: 2802 on 7870  Progress: 2803 on 7870  Progress: 2804 on 7870  Progress: 2805 on 7870  Progress: 2806 on 7870  Progress: 2807 on 7870  Progress: 2808 on 7870  Progress: 2809 on 7870  Progress: 2810 on 7870  Progress: 2811 on 7870  Progress: 2812 on 7870  Progress: 2813 on 7870  Progress: 2814 on 7870  Progress: 2815 on 7870  Progress: 2816 on 7870  Progress: 2817 on 7870  Progress: 2818 on 7870  Progress: 2819 on 7870  Progress: 2820 on 7870  Progress: 2821 on 7870  Progress: 2822 on 7870  Progress: 2823 on 7870  Progress: 2824 on 7870  Progress: 2825 on 7870  Progress: 2826 on 7870  Progress: 2827 on 7870  Progress: 2828 on 7870  Progress: 2829 on 7870  Progress: 2830 on 7870  Progress: 2831 on 7870  Progress: 2832 on 7870  Progress: 2833 on 7870  Progress: 2834 on 7870  Progress: 2835 on 7870  Progress: 2836 on 7870  Progress: 2837 on 7870  Progress: 2838 on 7870  Progress: 2839 on 7870  Progress: 2840 on 7870  Progress: 2841 on 7870  Progress: 2842 on 7870  Progress: 2843 on 7870  Progress: 2844 on 7870  Progress: 2845 on 7870  Progress: 2846 on 7870  Progress: 2847 on 7870  Progress: 2848 on 7870  Progress: 2849 on 7870  Progress: 2850 on 7870  Progress: 2851 on 7870  Progress: 2852 on 7870  Progress: 2853 on 7870  Progress: 2854 on 7870  Progress: 2855 on 7870  Progress: 2856 on 7870  Progress: 2857 on 7870  Progress: 2858 on 7870  Progress: 2859 on 7870  Progress: 2860 on 7870  Progress: 2861 on 7870  Progress: 2862 on 7870  Progress: 2863 on 7870  Progress: 2864 on 7870  Progress: 2865 on 7870  Progress: 2866 on 7870  Progress: 2867 on 7870  Progress: 2868 on 7870  Progress: 2869 on 7870  Progress: 2870 on 7870  Progress: 2871 on 7870  Progress: 2872 on 7870  Progress: 2873 on 7870  Progress: 2874 on 7870  Progress: 2875 on 7870  Progress: 2876 on 7870  Progress: 2877 on 7870  Progress: 2878 on 7870  Progress: 2879 on 7870  Progress: 2880 on 7870  Progress: 2881 on 7870  Progress: 2882 on 7870  Progress: 2883 on 7870  Progress: 2884 on 7870  Progress: 2885 on 7870  Progress: 2886 on 7870  Progress: 2887 on 7870  Progress: 2888 on 7870  Progress: 2889 on 7870  Progress: 2890 on 7870  Progress: 2891 on 7870  Progress: 2892 on 7870  Progress: 2893 on 7870  Progress: 2894 on 7870  Progress: 2895 on 7870  Progress: 2896 on 7870  Progress: 2897 on 7870  Progress: 2898 on 7870  Progress: 2899 on 7870  Progress: 2900 on 7870  Progress: 2901 on 7870  Progress: 2902 on 7870  Progress: 2903 on 7870  Progress: 2904 on 7870  Progress: 2905 on 7870  Progress: 2906 on 7870  Progress: 2907 on 7870  Progress: 2908 on 7870  Progress: 2909 on 7870  Progress: 2910 on 7870  Progress: 2911 on 7870  Progress: 2912 on 7870  Progress: 2913 on 7870  Progress: 2914 on 7870  Progress: 2915 on 7870  Progress: 2916 on 7870  Progress: 2917 on 7870  Progress: 2918 on 7870  Progress: 2919 on 7870  Progress: 2920 on 7870  Progress: 2921 on 7870  Progress: 2922 on 7870  Progress: 2923 on 7870  Progress: 2924 on 7870  Progress: 2925 on 7870  Progress: 2926 on 7870  Progress: 2927 on 7870  Progress: 2928 on 7870  Progress: 2929 on 7870  Progress: 2930 on 7870  Progress: 2931 on 7870  Progress: 2932 on 7870  Progress: 2933 on 7870  Progress: 2934 on 7870  Progress: 2935 on 7870  Progress: 2936 on 7870  Progress: 2937 on 7870  Progress: 2938 on 7870  Progress: 2939 on 7870  Progress: 2940 on 7870  Progress: 2941 on 7870  Progress: 2942 on 7870  Progress: 2943 on 7870  Progress: 2944 on 7870  Progress: 2945 on 7870  Progress: 2946 on 7870  Progress: 2947 on 7870  Progress: 2948 on 7870  Progress: 2949 on 7870  Progress: 2950 on 7870  Progress: 2951 on 7870  Progress: 2952 on 7870  Progress: 2953 on 7870  Progress: 2954 on 7870  Progress: 2955 on 7870  Progress: 2956 on 7870  Progress: 2957 on 7870  Progress: 2958 on 7870  Progress: 2959 on 7870  Progress: 2960 on 7870  Progress: 2961 on 7870  Progress: 2962 on 7870  Progress: 2963 on 7870  Progress: 2964 on 7870  Progress: 2965 on 7870  Progress: 2966 on 7870  Progress: 2967 on 7870  Progress: 2968 on 7870  Progress: 2969 on 7870  Progress: 2970 on 7870  Progress: 2971 on 7870  Progress: 2972 on 7870  Progress: 2973 on 7870  Progress: 2974 on 7870  Progress: 2975 on 7870  Progress: 2976 on 7870  Progress: 2977 on 7870  Progress: 2978 on 7870  Progress: 2979 on 7870  Progress: 2980 on 7870  Progress: 2981 on 7870  Progress: 2982 on 7870  Progress: 2983 on 7870  Progress: 2984 on 7870  Progress: 2985 on 7870  Progress: 2986 on 7870  Progress: 2987 on 7870  Progress: 2988 on 7870  Progress: 2989 on 7870  Progress: 2990 on 7870  Progress: 2991 on 7870  Progress: 2992 on 7870  Progress: 2993 on 7870  Progress: 2994 on 7870  Progress: 2995 on 7870  Progress: 2996 on 7870  Progress: 2997 on 7870  Progress: 2998 on 7870  Progress: 2999 on 7870  Progress: 3000 on 7870  Progress: 3001 on 7870  Progress: 3002 on 7870  Progress: 3003 on 7870  Progress: 3004 on 7870  Progress: 3005 on 7870  Progress: 3006 on 7870  Progress: 3007 on 7870  Progress: 3008 on 7870  Progress: 3009 on 7870  Progress: 3010 on 7870  Progress: 3011 on 7870  Progress: 3012 on 7870  Progress: 3013 on 7870  Progress: 3014 on 7870  Progress: 3015 on 7870  Progress: 3016 on 7870  Progress: 3017 on 7870  Progress: 3018 on 7870  Progress: 3019 on 7870  Progress: 3020 on 7870  Progress: 3021 on 7870  Progress: 3022 on 7870  Progress: 3023 on 7870  Progress: 3024 on 7870  Progress: 3025 on 7870  Progress: 3026 on 7870  Progress: 3027 on 7870  Progress: 3028 on 7870  Progress: 3029 on 7870  Progress: 3030 on 7870  Progress: 3031 on 7870  Progress: 3032 on 7870  Progress: 3033 on 7870  Progress: 3034 on 7870  Progress: 3035 on 7870  Progress: 3036 on 7870  Progress: 3037 on 7870  Progress: 3038 on 7870  Progress: 3039 on 7870  Progress: 3040 on 7870  Progress: 3041 on 7870  Progress: 3042 on 7870  Progress: 3043 on 7870  Progress: 3044 on 7870  Progress: 3045 on 7870  Progress: 3046 on 7870  Progress: 3047 on 7870  Progress: 3048 on 7870  Progress: 3049 on 7870  Progress: 3050 on 7870  Progress: 3051 on 7870  Progress: 3052 on 7870  Progress: 3053 on 7870  Progress: 3054 on 7870  Progress: 3055 on 7870  Progress: 3056 on 7870  Progress: 3057 on 7870  Progress: 3058 on 7870  Progress: 3059 on 7870  Progress: 3060 on 7870  Progress: 3061 on 7870  Progress: 3062 on 7870  Progress: 3063 on 7870  Progress: 3064 on 7870  Progress: 3065 on 7870  Progress: 3066 on 7870  Progress: 3067 on 7870  Progress: 3068 on 7870  Progress: 3069 on 7870  Progress: 3070 on 7870  Progress: 3071 on 7870  Progress: 3072 on 7870  Progress: 3073 on 7870  Progress: 3074 on 7870  Progress: 3075 on 7870  Progress: 3076 on 7870  Progress: 3077 on 7870  Progress: 3078 on 7870  Progress: 3079 on 7870  Progress: 3080 on 7870  Progress: 3081 on 7870  Progress: 3082 on 7870  Progress: 3083 on 7870  Progress: 3084 on 7870  Progress: 3085 on 7870  Progress: 3086 on 7870  Progress: 3087 on 7870  Progress: 3088 on 7870  Progress: 3089 on 7870  Progress: 3090 on 7870  Progress: 3091 on 7870  Progress: 3092 on 7870  Progress: 3093 on 7870  Progress: 3094 on 7870  Progress: 3095 on 7870  Progress: 3096 on 7870  Progress: 3097 on 7870  Progress: 3098 on 7870  Progress: 3099 on 7870  Progress: 3100 on 7870  Progress: 3101 on 7870  Progress: 3102 on 7870  Progress: 3103 on 7870  Progress: 3104 on 7870  Progress: 3105 on 7870  Progress: 3106 on 7870  Progress: 3107 on 7870  Progress: 3108 on 7870  Progress: 3109 on 7870  Progress: 3110 on 7870  Progress: 3111 on 7870  Progress: 3112 on 7870  Progress: 3113 on 7870  Progress: 3114 on 7870  Progress: 3115 on 7870  Progress: 3116 on 7870  Progress: 3117 on 7870  Progress: 3118 on 7870  Progress: 3119 on 7870  Progress: 3120 on 7870  Progress: 3121 on 7870  Progress: 3122 on 7870  Progress: 3123 on 7870  Progress: 3124 on 7870  Progress: 3125 on 7870  Progress: 3126 on 7870  Progress: 3127 on 7870  Progress: 3128 on 7870  Progress: 3129 on 7870  Progress: 3130 on 7870  Progress: 3131 on 7870  Progress: 3132 on 7870  Progress: 3133 on 7870  Progress: 3134 on 7870  Progress: 3135 on 7870  Progress: 3136 on 7870  Progress: 3137 on 7870  Progress: 3138 on 7870  Progress: 3139 on 7870  Progress: 3140 on 7870  Progress: 3141 on 7870  Progress: 3142 on 7870  Progress: 3143 on 7870  Progress: 3144 on 7870  Progress: 3145 on 7870  Progress: 3146 on 7870  Progress: 3147 on 7870  Progress: 3148 on 7870  Progress: 3149 on 7870  Progress: 3150 on 7870  Progress: 3151 on 7870  Progress: 3152 on 7870  Progress: 3153 on 7870  Progress: 3154 on 7870  Progress: 3155 on 7870  Progress: 3156 on 7870  Progress: 3157 on 7870  Progress: 3158 on 7870  Progress: 3159 on 7870  Progress: 3160 on 7870  Progress: 3161 on 7870  Progress: 3162 on 7870  Progress: 3163 on 7870  Progress: 3164 on 7870  Progress: 3165 on 7870  Progress: 3166 on 7870  Progress: 3167 on 7870  Progress: 3168 on 7870  Progress: 3169 on 7870  Progress: 3170 on 7870  Progress: 3171 on 7870  Progress: 3172 on 7870  Progress: 3173 on 7870  Progress: 3174 on 7870  Progress: 3175 on 7870  Progress: 3176 on 7870  Progress: 3177 on 7870  Progress: 3178 on 7870  Progress: 3179 on 7870  Progress: 3180 on 7870  Progress: 3181 on 7870  Progress: 3182 on 7870  Progress: 3183 on 7870  Progress: 3184 on 7870  Progress: 3185 on 7870  Progress: 3186 on 7870  Progress: 3187 on 7870  Progress: 3188 on 7870  Progress: 3189 on 7870  Progress: 3190 on 7870  Progress: 3191 on 7870  Progress: 3192 on 7870  Progress: 3193 on 7870  Progress: 3194 on 7870  Progress: 3195 on 7870  Progress: 3196 on 7870  Progress: 3197 on 7870  Progress: 3198 on 7870  Progress: 3199 on 7870  Progress: 3200 on 7870  Progress: 3201 on 7870  Progress: 3202 on 7870  Progress: 3203 on 7870  Progress: 3204 on 7870  Progress: 3205 on 7870  Progress: 3206 on 7870  Progress: 3207 on 7870  Progress: 3208 on 7870  Progress: 3209 on 7870  Progress: 3210 on 7870  Progress: 3211 on 7870  Progress: 3212 on 7870  Progress: 3213 on 7870  Progress: 3214 on 7870  Progress: 3215 on 7870  Progress: 3216 on 7870  Progress: 3217 on 7870  Progress: 3218 on 7870  Progress: 3219 on 7870  Progress: 3220 on 7870  Progress: 3221 on 7870  Progress: 3222 on 7870  Progress: 3223 on 7870  Progress: 3224 on 7870  Progress: 3225 on 7870  Progress: 3226 on 7870  Progress: 3227 on 7870  Progress: 3228 on 7870  Progress: 3229 on 7870  Progress: 3230 on 7870  Progress: 3231 on 7870  Progress: 3232 on 7870  Progress: 3233 on 7870  Progress: 3234 on 7870  Progress: 3235 on 7870  Progress: 3236 on 7870  Progress: 3237 on 7870  Progress: 3238 on 7870  Progress: 3239 on 7870  Progress: 3240 on 7870  Progress: 3241 on 7870  Progress: 3242 on 7870  Progress: 3243 on 7870  Progress: 3244 on 7870  Progress: 3245 on 7870  Progress: 3246 on 7870  Progress: 3247 on 7870  Progress: 3248 on 7870  Progress: 3249 on 7870  Progress: 3250 on 7870  Progress: 3251 on 7870  Progress: 3252 on 7870  Progress: 3253 on 7870  Progress: 3254 on 7870  Progress: 3255 on 7870  Progress: 3256 on 7870  Progress: 3257 on 7870  Progress: 3258 on 7870  Progress: 3259 on 7870  Progress: 3260 on 7870  Progress: 3261 on 7870  Progress: 3262 on 7870  Progress: 3263 on 7870  Progress: 3264 on 7870  Progress: 3265 on 7870  Progress: 3266 on 7870  Progress: 3267 on 7870  Progress: 3268 on 7870  Progress: 3269 on 7870  Progress: 3270 on 7870  Progress: 3271 on 7870  Progress: 3272 on 7870  Progress: 3273 on 7870  Progress: 3274 on 7870  Progress: 3275 on 7870  Progress: 3276 on 7870  Progress: 3277 on 7870  Progress: 3278 on 7870  Progress: 3279 on 7870  Progress: 3280 on 7870  Progress: 3281 on 7870  Progress: 3282 on 7870  Progress: 3283 on 7870  Progress: 3284 on 7870  Progress: 3285 on 7870  Progress: 3286 on 7870  Progress: 3287 on 7870  Progress: 3288 on 7870  Progress: 3289 on 7870  Progress: 3290 on 7870  Progress: 3291 on 7870  Progress: 3292 on 7870  Progress: 3293 on 7870  Progress: 3294 on 7870  Progress: 3295 on 7870  Progress: 3296 on 7870  Progress: 3297 on 7870  Progress: 3298 on 7870  Progress: 3299 on 7870  Progress: 3300 on 7870  Progress: 3301 on 7870  Progress: 3302 on 7870  Progress: 3303 on 7870  Progress: 3304 on 7870  Progress: 3305 on 7870  Progress: 3306 on 7870  Progress: 3307 on 7870  Progress: 3308 on 7870  Progress: 3309 on 7870  Progress: 3310 on 7870  Progress: 3311 on 7870  Progress: 3312 on 7870  Progress: 3313 on 7870  Progress: 3314 on 7870  Progress: 3315 on 7870  Progress: 3316 on 7870  Progress: 3317 on 7870  Progress: 3318 on 7870  Progress: 3319 on 7870  Progress: 3320 on 7870  Progress: 3321 on 7870  Progress: 3322 on 7870  Progress: 3323 on 7870  Progress: 3324 on 7870  Progress: 3325 on 7870  Progress: 3326 on 7870  Progress: 3327 on 7870  Progress: 3328 on 7870  Progress: 3329 on 7870  Progress: 3330 on 7870  Progress: 3331 on 7870  Progress: 3332 on 7870  Progress: 3333 on 7870  Progress: 3334 on 7870  Progress: 3335 on 7870  Progress: 3336 on 7870  Progress: 3337 on 7870  Progress: 3338 on 7870  Progress: 3339 on 7870  Progress: 3340 on 7870  Progress: 3341 on 7870  Progress: 3342 on 7870  Progress: 3343 on 7870  Progress: 3344 on 7870  Progress: 3345 on 7870  Progress: 3346 on 7870  Progress: 3347 on 7870  Progress: 3348 on 7870  Progress: 3349 on 7870  Progress: 3350 on 7870  Progress: 3351 on 7870  Progress: 3352 on 7870  Progress: 3353 on 7870  Progress: 3354 on 7870  Progress: 3355 on 7870  Progress: 3356 on 7870  Progress: 3357 on 7870  Progress: 3358 on 7870  Progress: 3359 on 7870  Progress: 3360 on 7870  Progress: 3361 on 7870  Progress: 3362 on 7870  Progress: 3363 on 7870  Progress: 3364 on 7870  Progress: 3365 on 7870  Progress: 3366 on 7870  Progress: 3367 on 7870  Progress: 3368 on 7870  Progress: 3369 on 7870  Progress: 3370 on 7870  Progress: 3371 on 7870  Progress: 3372 on 7870  Progress: 3373 on 7870  Progress: 3374 on 7870  Progress: 3375 on 7870  Progress: 3376 on 7870  Progress: 3377 on 7870  Progress: 3378 on 7870  Progress: 3379 on 7870  Progress: 3380 on 7870  Progress: 3381 on 7870  Progress: 3382 on 7870  Progress: 3383 on 7870  Progress: 3384 on 7870  Progress: 3385 on 7870  Progress: 3386 on 7870  Progress: 3387 on 7870  Progress: 3388 on 7870  Progress: 3389 on 7870  Progress: 3390 on 7870  Progress: 3391 on 7870  Progress: 3392 on 7870  Progress: 3393 on 7870  Progress: 3394 on 7870  Progress: 3395 on 7870  Progress: 3396 on 7870  Progress: 3397 on 7870  Progress: 3398 on 7870  Progress: 3399 on 7870  Progress: 3400 on 7870  Progress: 3401 on 7870  Progress: 3402 on 7870  Progress: 3403 on 7870  Progress: 3404 on 7870  Progress: 3405 on 7870  Progress: 3406 on 7870  Progress: 3407 on 7870  Progress: 3408 on 7870  Progress: 3409 on 7870  Progress: 3410 on 7870  Progress: 3411 on 7870  Progress: 3412 on 7870  Progress: 3413 on 7870  Progress: 3414 on 7870  Progress: 3415 on 7870  Progress: 3416 on 7870  Progress: 3417 on 7870  Progress: 3418 on 7870  Progress: 3419 on 7870  Progress: 3420 on 7870  Progress: 3421 on 7870  Progress: 3422 on 7870  Progress: 3423 on 7870  Progress: 3424 on 7870  Progress: 3425 on 7870  Progress: 3426 on 7870  Progress: 3427 on 7870  Progress: 3428 on 7870  Progress: 3429 on 7870  Progress: 3430 on 7870  Progress: 3431 on 7870  Progress: 3432 on 7870  Progress: 3433 on 7870  Progress: 3434 on 7870  Progress: 3435 on 7870  Progress: 3436 on 7870  Progress: 3437 on 7870  Progress: 3438 on 7870  Progress: 3439 on 7870  Progress: 3440 on 7870  Progress: 3441 on 7870  Progress: 3442 on 7870  Progress: 3443 on 7870  Progress: 3444 on 7870  Progress: 3445 on 7870  Progress: 3446 on 7870  Progress: 3447 on 7870  Progress: 3448 on 7870  Progress: 3449 on 7870  Progress: 3450 on 7870  Progress: 3451 on 7870  Progress: 3452 on 7870  Progress: 3453 on 7870  Progress: 3454 on 7870  Progress: 3455 on 7870  Progress: 3456 on 7870  Progress: 3457 on 7870  Progress: 3458 on 7870  Progress: 3459 on 7870  Progress: 3460 on 7870  Progress: 3461 on 7870  Progress: 3462 on 7870  Progress: 3463 on 7870  Progress: 3464 on 7870  Progress: 3465 on 7870  Progress: 3466 on 7870  Progress: 3467 on 7870  Progress: 3468 on 7870  Progress: 3469 on 7870  Progress: 3470 on 7870  Progress: 3471 on 7870  Progress: 3472 on 7870  Progress: 3473 on 7870  Progress: 3474 on 7870  Progress: 3475 on 7870  Progress: 3476 on 7870  Progress: 3477 on 7870  Progress: 3478 on 7870  Progress: 3479 on 7870  Progress: 3480 on 7870  Progress: 3481 on 7870  Progress: 3482 on 7870  Progress: 3483 on 7870  Progress: 3484 on 7870  Progress: 3485 on 7870  Progress: 3486 on 7870  Progress: 3487 on 7870  Progress: 3488 on 7870  Progress: 3489 on 7870  Progress: 3490 on 7870  Progress: 3491 on 7870  Progress: 3492 on 7870  Progress: 3493 on 7870  Progress: 3494 on 7870  Progress: 3495 on 7870  Progress: 3496 on 7870  Progress: 3497 on 7870  Progress: 3498 on 7870  Progress: 3499 on 7870  Progress: 3500 on 7870  Progress: 3501 on 7870  Progress: 3502 on 7870  Progress: 3503 on 7870  Progress: 3504 on 7870  Progress: 3505 on 7870  Progress: 3506 on 7870  Progress: 3507 on 7870  Progress: 3508 on 7870  Progress: 3509 on 7870  Progress: 3510 on 7870  Progress: 3511 on 7870  Progress: 3512 on 7870  Progress: 3513 on 7870  Progress: 3514 on 7870  Progress: 3515 on 7870  Progress: 3516 on 7870  Progress: 3517 on 7870  Progress: 3518 on 7870  Progress: 3519 on 7870  Progress: 3520 on 7870  Progress: 3521 on 7870  Progress: 3522 on 7870  Progress: 3523 on 7870  Progress: 3524 on 7870  Progress: 3525 on 7870  Progress: 3526 on 7870  Progress: 3527 on 7870  Progress: 3528 on 7870  Progress: 3529 on 7870  Progress: 3530 on 7870  Progress: 3531 on 7870  Progress: 3532 on 7870  Progress: 3533 on 7870  Progress: 3534 on 7870  Progress: 3535 on 7870  Progress: 3536 on 7870  Progress: 3537 on 7870  Progress: 3538 on 7870  Progress: 3539 on 7870  Progress: 3540 on 7870  Progress: 3541 on 7870  Progress: 3542 on 7870  Progress: 3543 on 7870  Progress: 3544 on 7870  Progress: 3545 on 7870  Progress: 3546 on 7870  Progress: 3547 on 7870  Progress: 3548 on 7870  Progress: 3549 on 7870  Progress: 3550 on 7870  Progress: 3551 on 7870  Progress: 3552 on 7870  Progress: 3553 on 7870  Progress: 3554 on 7870  Progress: 3555 on 7870  Progress: 3556 on 7870  Progress: 3557 on 7870  Progress: 3558 on 7870  Progress: 3559 on 7870  Progress: 3560 on 7870  Progress: 3561 on 7870  Progress: 3562 on 7870  Progress: 3563 on 7870  Progress: 3564 on 7870  Progress: 3565 on 7870  Progress: 3566 on 7870  Progress: 3567 on 7870  Progress: 3568 on 7870  Progress: 3569 on 7870  Progress: 3570 on 7870  Progress: 3571 on 7870  Progress: 3572 on 7870  Progress: 3573 on 7870  Progress: 3574 on 7870  Progress: 3575 on 7870  Progress: 3576 on 7870  Progress: 3577 on 7870  Progress: 3578 on 7870  Progress: 3579 on 7870  Progress: 3580 on 7870  Progress: 3581 on 7870  Progress: 3582 on 7870  Progress: 3583 on 7870  Progress: 3584 on 7870  Progress: 3585 on 7870  Progress: 3586 on 7870  Progress: 3587 on 7870  Progress: 3588 on 7870  Progress: 3589 on 7870  Progress: 3590 on 7870  Progress: 3591 on 7870  Progress: 3592 on 7870  Progress: 3593 on 7870  Progress: 3594 on 7870  Progress: 3595 on 7870  Progress: 3596 on 7870  Progress: 3597 on 7870  Progress: 3598 on 7870  Progress: 3599 on 7870  Progress: 3600 on 7870  Progress: 3601 on 7870  Progress: 3602 on 7870  Progress: 3603 on 7870  Progress: 3604 on 7870  Progress: 3605 on 7870  Progress: 3606 on 7870  Progress: 3607 on 7870  Progress: 3608 on 7870  Progress: 3609 on 7870  Progress: 3610 on 7870  Progress: 3611 on 7870  Progress: 3612 on 7870  Progress: 3613 on 7870  Progress: 3614 on 7870  Progress: 3615 on 7870  Progress: 3616 on 7870  Progress: 3617 on 7870  Progress: 3618 on 7870  Progress: 3619 on 7870  Progress: 3620 on 7870  Progress: 3621 on 7870  Progress: 3622 on 7870  Progress: 3623 on 7870  Progress: 3624 on 7870  Progress: 3625 on 7870  Progress: 3626 on 7870  Progress: 3627 on 7870  Progress: 3628 on 7870  Progress: 3629 on 7870  Progress: 3630 on 7870  Progress: 3631 on 7870  Progress: 3632 on 7870  Progress: 3633 on 7870  Progress: 3634 on 7870  Progress: 3635 on 7870  Progress: 3636 on 7870  Progress: 3637 on 7870  Progress: 3638 on 7870  Progress: 3639 on 7870  Progress: 3640 on 7870  Progress: 3641 on 7870  Progress: 3642 on 7870  Progress: 3643 on 7870  Progress: 3644 on 7870  Progress: 3645 on 7870  Progress: 3646 on 7870  Progress: 3647 on 7870  Progress: 3648 on 7870  Progress: 3649 on 7870  Progress: 3650 on 7870  Progress: 3651 on 7870  Progress: 3652 on 7870  Progress: 3653 on 7870  Progress: 3654 on 7870  Progress: 3655 on 7870  Progress: 3656 on 7870  Progress: 3657 on 7870  Progress: 3658 on 7870  Progress: 3659 on 7870  Progress: 3660 on 7870  Progress: 3661 on 7870  Progress: 3662 on 7870  Progress: 3663 on 7870  Progress: 3664 on 7870  Progress: 3665 on 7870  Progress: 3666 on 7870  Progress: 3667 on 7870  Progress: 3668 on 7870  Progress: 3669 on 7870  Progress: 3670 on 7870  Progress: 3671 on 7870  Progress: 3672 on 7870  Progress: 3673 on 7870  Progress: 3674 on 7870  Progress: 3675 on 7870  Progress: 3676 on 7870  Progress: 3677 on 7870  Progress: 3678 on 7870  Progress: 3679 on 7870  Progress: 3680 on 7870  Progress: 3681 on 7870  Progress: 3682 on 7870  Progress: 3683 on 7870  Progress: 3684 on 7870  Progress: 3685 on 7870  Progress: 3686 on 7870  Progress: 3687 on 7870  Progress: 3688 on 7870  Progress: 3689 on 7870  Progress: 3690 on 7870  Progress: 3691 on 7870  Progress: 3692 on 7870  Progress: 3693 on 7870  Progress: 3694 on 7870  Progress: 3695 on 7870  Progress: 3696 on 7870  Progress: 3697 on 7870  Progress: 3698 on 7870  Progress: 3699 on 7870  Progress: 3700 on 7870  Progress: 3701 on 7870  Progress: 3702 on 7870  Progress: 3703 on 7870  Progress: 3704 on 7870  Progress: 3705 on 7870  Progress: 3706 on 7870  Progress: 3707 on 7870  Progress: 3708 on 7870  Progress: 3709 on 7870  Progress: 3710 on 7870  Progress: 3711 on 7870  Progress: 3712 on 7870  Progress: 3713 on 7870  Progress: 3714 on 7870  Progress: 3715 on 7870  Progress: 3716 on 7870  Progress: 3717 on 7870  Progress: 3718 on 7870  Progress: 3719 on 7870  Progress: 3720 on 7870  Progress: 3721 on 7870  Progress: 3722 on 7870  Progress: 3723 on 7870  Progress: 3724 on 7870  Progress: 3725 on 7870  Progress: 3726 on 7870  Progress: 3727 on 7870  Progress: 3728 on 7870  Progress: 3729 on 7870  Progress: 3730 on 7870  Progress: 3731 on 7870  Progress: 3732 on 7870  Progress: 3733 on 7870  Progress: 3734 on 7870  Progress: 3735 on 7870  Progress: 3736 on 7870  Progress: 3737 on 7870  Progress: 3738 on 7870  Progress: 3739 on 7870  Progress: 3740 on 7870  Progress: 3741 on 7870  Progress: 3742 on 7870  Progress: 3743 on 7870  Progress: 3744 on 7870  Progress: 3745 on 7870  Progress: 3746 on 7870  Progress: 3747 on 7870  Progress: 3748 on 7870  Progress: 3749 on 7870  Progress: 3750 on 7870  Progress: 3751 on 7870  Progress: 3752 on 7870  Progress: 3753 on 7870  Progress: 3754 on 7870  Progress: 3755 on 7870  Progress: 3756 on 7870  Progress: 3757 on 7870  Progress: 3758 on 7870  Progress: 3759 on 7870  Progress: 3760 on 7870  Progress: 3761 on 7870  Progress: 3762 on 7870  Progress: 3763 on 7870  Progress: 3764 on 7870  Progress: 3765 on 7870  Progress: 3766 on 7870  Progress: 3767 on 7870  Progress: 3768 on 7870  Progress: 3769 on 7870  Progress: 3770 on 7870  Progress: 3771 on 7870  Progress: 3772 on 7870  Progress: 3773 on 7870  Progress: 3774 on 7870  Progress: 3775 on 7870  Progress: 3776 on 7870  Progress: 3777 on 7870  Progress: 3778 on 7870  Progress: 3779 on 7870  Progress: 3780 on 7870  Progress: 3781 on 7870  Progress: 3782 on 7870  Progress: 3783 on 7870  Progress: 3784 on 7870  Progress: 3785 on 7870  Progress: 3786 on 7870  Progress: 3787 on 7870  Progress: 3788 on 7870  Progress: 3789 on 7870  Progress: 3790 on 7870  Progress: 3791 on 7870  Progress: 3792 on 7870  Progress: 3793 on 7870  Progress: 3794 on 7870  Progress: 3795 on 7870  Progress: 3796 on 7870  Progress: 3797 on 7870  Progress: 3798 on 7870  Progress: 3799 on 7870  Progress: 3800 on 7870  Progress: 3801 on 7870  Progress: 3802 on 7870  Progress: 3803 on 7870  Progress: 3804 on 7870  Progress: 3805 on 7870  Progress: 3806 on 7870  Progress: 3807 on 7870  Progress: 3808 on 7870  Progress: 3809 on 7870  Progress: 3810 on 7870  Progress: 3811 on 7870  Progress: 3812 on 7870  Progress: 3813 on 7870  Progress: 3814 on 7870  Progress: 3815 on 7870  Progress: 3816 on 7870  Progress: 3817 on 7870  Progress: 3818 on 7870  Progress: 3819 on 7870  Progress: 3820 on 7870  Progress: 3821 on 7870  Progress: 3822 on 7870  Progress: 3823 on 7870  Progress: 3824 on 7870  Progress: 3825 on 7870  Progress: 3826 on 7870  Progress: 3827 on 7870  Progress: 3828 on 7870  Progress: 3829 on 7870  Progress: 3830 on 7870  Progress: 3831 on 7870  Progress: 3832 on 7870  Progress: 3833 on 7870  Progress: 3834 on 7870  Progress: 3835 on 7870  Progress: 3836 on 7870  Progress: 3837 on 7870  Progress: 3838 on 7870  Progress: 3839 on 7870  Progress: 3840 on 7870  Progress: 3841 on 7870  Progress: 3842 on 7870  Progress: 3843 on 7870  Progress: 3844 on 7870  Progress: 3845 on 7870  Progress: 3846 on 7870  Progress: 3847 on 7870  Progress: 3848 on 7870  Progress: 3849 on 7870  Progress: 3850 on 7870  Progress: 3851 on 7870  Progress: 3852 on 7870  Progress: 3853 on 7870  Progress: 3854 on 7870  Progress: 3855 on 7870  Progress: 3856 on 7870  Progress: 3857 on 7870  Progress: 3858 on 7870  Progress: 3859 on 7870  Progress: 3860 on 7870  Progress: 3861 on 7870  Progress: 3862 on 7870  Progress: 3863 on 7870  Progress: 3864 on 7870  Progress: 3865 on 7870  Progress: 3866 on 7870  Progress: 3867 on 7870  Progress: 3868 on 7870  Progress: 3869 on 7870  Progress: 3870 on 7870  Progress: 3871 on 7870  Progress: 3872 on 7870  Progress: 3873 on 7870  Progress: 3874 on 7870  Progress: 3875 on 7870  Progress: 3876 on 7870  Progress: 3877 on 7870  Progress: 3878 on 7870  Progress: 3879 on 7870  Progress: 3880 on 7870  Progress: 3881 on 7870  Progress: 3882 on 7870  Progress: 3883 on 7870  Progress: 3884 on 7870  Progress: 3885 on 7870  Progress: 3886 on 7870  Progress: 3887 on 7870  Progress: 3888 on 7870  Progress: 3889 on 7870  Progress: 3890 on 7870  Progress: 3891 on 7870  Progress: 3892 on 7870  Progress: 3893 on 7870  Progress: 3894 on 7870  Progress: 3895 on 7870  Progress: 3896 on 7870  Progress: 3897 on 7870  Progress: 3898 on 7870  Progress: 3899 on 7870  Progress: 3900 on 7870  Progress: 3901 on 7870  Progress: 3902 on 7870  Progress: 3903 on 7870  Progress: 3904 on 7870  Progress: 3905 on 7870  Progress: 3906 on 7870  Progress: 3907 on 7870  Progress: 3908 on 7870  Progress: 3909 on 7870  Progress: 3910 on 7870  Progress: 3911 on 7870  Progress: 3912 on 7870  Progress: 3913 on 7870  Progress: 3914 on 7870  Progress: 3915 on 7870  Progress: 3916 on 7870  Progress: 3917 on 7870  Progress: 3918 on 7870  Progress: 3919 on 7870  Progress: 3920 on 7870  Progress: 3921 on 7870  Progress: 3922 on 7870  Progress: 3923 on 7870  Progress: 3924 on 7870  Progress: 3925 on 7870  Progress: 3926 on 7870  Progress: 3927 on 7870  Progress: 3928 on 7870  Progress: 3929 on 7870  Progress: 3930 on 7870  Progress: 3931 on 7870  Progress: 3932 on 7870  Progress: 3933 on 7870  Progress: 3934 on 7870  Progress: 3935 on 7870  Progress: 3936 on 7870  Progress: 3937 on 7870  Progress: 3938 on 7870  Progress: 3939 on 7870  Progress: 3940 on 7870  Progress: 3941 on 7870  Progress: 3942 on 7870  Progress: 3943 on 7870  Progress: 3944 on 7870  Progress: 3945 on 7870  Progress: 3946 on 7870  Progress: 3947 on 7870  Progress: 3948 on 7870  Progress: 3949 on 7870  Progress: 3950 on 7870  Progress: 3951 on 7870  Progress: 3952 on 7870  Progress: 3953 on 7870  Progress: 3954 on 7870  Progress: 3955 on 7870  Progress: 3956 on 7870  Progress: 3957 on 7870  Progress: 3958 on 7870  Progress: 3959 on 7870  Progress: 3960 on 7870  Progress: 3961 on 7870  Progress: 3962 on 7870  Progress: 3963 on 7870  Progress: 3964 on 7870  Progress: 3965 on 7870  Progress: 3966 on 7870  Progress: 3967 on 7870  Progress: 3968 on 7870  Progress: 3969 on 7870  Progress: 3970 on 7870  Progress: 3971 on 7870  Progress: 3972 on 7870  Progress: 3973 on 7870  Progress: 3974 on 7870  Progress: 3975 on 7870  Progress: 3976 on 7870  Progress: 3977 on 7870  Progress: 3978 on 7870  Progress: 3979 on 7870  Progress: 3980 on 7870  Progress: 3981 on 7870  Progress: 3982 on 7870  Progress: 3983 on 7870  Progress: 3984 on 7870  Progress: 3985 on 7870  Progress: 3986 on 7870  Progress: 3987 on 7870  Progress: 3988 on 7870  Progress: 3989 on 7870  Progress: 3990 on 7870  Progress: 3991 on 7870  Progress: 3992 on 7870  Progress: 3993 on 7870  Progress: 3994 on 7870  Progress: 3995 on 7870  Progress: 3996 on 7870  Progress: 3997 on 7870  Progress: 3998 on 7870  Progress: 3999 on 7870  Progress: 4000 on 7870  Progress: 4001 on 7870  Progress: 4002 on 7870  Progress: 4003 on 7870  Progress: 4004 on 7870  Progress: 4005 on 7870  Progress: 4006 on 7870  Progress: 4007 on 7870  Progress: 4008 on 7870  Progress: 4009 on 7870  Progress: 4010 on 7870  Progress: 4011 on 7870  Progress: 4012 on 7870  Progress: 4013 on 7870  Progress: 4014 on 7870  Progress: 4015 on 7870  Progress: 4016 on 7870  Progress: 4017 on 7870  Progress: 4018 on 7870  Progress: 4019 on 7870  Progress: 4020 on 7870  Progress: 4021 on 7870  Progress: 4022 on 7870  Progress: 4023 on 7870  Progress: 4024 on 7870  Progress: 4025 on 7870  Progress: 4026 on 7870  Progress: 4027 on 7870  Progress: 4028 on 7870  Progress: 4029 on 7870  Progress: 4030 on 7870  Progress: 4031 on 7870  Progress: 4032 on 7870  Progress: 4033 on 7870  Progress: 4034 on 7870  Progress: 4035 on 7870  Progress: 4036 on 7870  Progress: 4037 on 7870  Progress: 4038 on 7870  Progress: 4039 on 7870  Progress: 4040 on 7870  Progress: 4041 on 7870  Progress: 4042 on 7870  Progress: 4043 on 7870  Progress: 4044 on 7870  Progress: 4045 on 7870  Progress: 4046 on 7870  Progress: 4047 on 7870  Progress: 4048 on 7870  Progress: 4049 on 7870  Progress: 4050 on 7870  Progress: 4051 on 7870  Progress: 4052 on 7870  Progress: 4053 on 7870  Progress: 4054 on 7870  Progress: 4055 on 7870  Progress: 4056 on 7870  Progress: 4057 on 7870  Progress: 4058 on 7870  Progress: 4059 on 7870  Progress: 4060 on 7870  Progress: 4061 on 7870  Progress: 4062 on 7870  Progress: 4063 on 7870  Progress: 4064 on 7870  Progress: 4065 on 7870  Progress: 4066 on 7870  Progress: 4067 on 7870  Progress: 4068 on 7870  Progress: 4069 on 7870  Progress: 4070 on 7870  Progress: 4071 on 7870  Progress: 4072 on 7870  Progress: 4073 on 7870  Progress: 4074 on 7870  Progress: 4075 on 7870  Progress: 4076 on 7870  Progress: 4077 on 7870  Progress: 4078 on 7870  Progress: 4079 on 7870  Progress: 4080 on 7870  Progress: 4081 on 7870  Progress: 4082 on 7870  Progress: 4083 on 7870  Progress: 4084 on 7870  Progress: 4085 on 7870  Progress: 4086 on 7870  Progress: 4087 on 7870  Progress: 4088 on 7870  Progress: 4089 on 7870  Progress: 4090 on 7870  Progress: 4091 on 7870  Progress: 4092 on 7870  Progress: 4093 on 7870  Progress: 4094 on 7870  Progress: 4095 on 7870  Progress: 4096 on 7870  Progress: 4097 on 7870  Progress: 4098 on 7870  Progress: 4099 on 7870  Progress: 4100 on 7870  Progress: 4101 on 7870  Progress: 4102 on 7870  Progress: 4103 on 7870  Progress: 4104 on 7870  Progress: 4105 on 7870  Progress: 4106 on 7870  Progress: 4107 on 7870  Progress: 4108 on 7870  Progress: 4109 on 7870  Progress: 4110 on 7870  Progress: 4111 on 7870  Progress: 4112 on 7870  Progress: 4113 on 7870  Progress: 4114 on 7870  Progress: 4115 on 7870  Progress: 4116 on 7870  Progress: 4117 on 7870  Progress: 4118 on 7870  Progress: 4119 on 7870  Progress: 4120 on 7870  Progress: 4121 on 7870  Progress: 4122 on 7870  Progress: 4123 on 7870  Progress: 4124 on 7870  Progress: 4125 on 7870  Progress: 4126 on 7870  Progress: 4127 on 7870  Progress: 4128 on 7870  Progress: 4129 on 7870  Progress: 4130 on 7870  Progress: 4131 on 7870  Progress: 4132 on 7870  Progress: 4133 on 7870  Progress: 4134 on 7870  Progress: 4135 on 7870  Progress: 4136 on 7870  Progress: 4137 on 7870  Progress: 4138 on 7870  Progress: 4139 on 7870  Progress: 4140 on 7870  Progress: 4141 on 7870  Progress: 4142 on 7870  Progress: 4143 on 7870  Progress: 4144 on 7870  Progress: 4145 on 7870  Progress: 4146 on 7870  Progress: 4147 on 7870  Progress: 4148 on 7870  Progress: 4149 on 7870  Progress: 4150 on 7870  Progress: 4151 on 7870  Progress: 4152 on 7870  Progress: 4153 on 7870  Progress: 4154 on 7870  Progress: 4155 on 7870  Progress: 4156 on 7870  Progress: 4157 on 7870  Progress: 4158 on 7870  Progress: 4159 on 7870  Progress: 4160 on 7870  Progress: 4161 on 7870  Progress: 4162 on 7870  Progress: 4163 on 7870  Progress: 4164 on 7870  Progress: 4165 on 7870  Progress: 4166 on 7870  Progress: 4167 on 7870  Progress: 4168 on 7870  Progress: 4169 on 7870  Progress: 4170 on 7870  Progress: 4171 on 7870  Progress: 4172 on 7870  Progress: 4173 on 7870  Progress: 4174 on 7870  Progress: 4175 on 7870  Progress: 4176 on 7870  Progress: 4177 on 7870  Progress: 4178 on 7870  Progress: 4179 on 7870  Progress: 4180 on 7870  Progress: 4181 on 7870  Progress: 4182 on 7870  Progress: 4183 on 7870  Progress: 4184 on 7870  Progress: 4185 on 7870  Progress: 4186 on 7870  Progress: 4187 on 7870  Progress: 4188 on 7870  Progress: 4189 on 7870  Progress: 4190 on 7870  Progress: 4191 on 7870  Progress: 4192 on 7870  Progress: 4193 on 7870  Progress: 4194 on 7870  Progress: 4195 on 7870  Progress: 4196 on 7870  Progress: 4197 on 7870  Progress: 4198 on 7870  Progress: 4199 on 7870  Progress: 4200 on 7870  Progress: 4201 on 7870  Progress: 4202 on 7870  Progress: 4203 on 7870  Progress: 4204 on 7870  Progress: 4205 on 7870  Progress: 4206 on 7870  Progress: 4207 on 7870  Progress: 4208 on 7870  Progress: 4209 on 7870  Progress: 4210 on 7870  Progress: 4211 on 7870  Progress: 4212 on 7870  Progress: 4213 on 7870  Progress: 4214 on 7870  Progress: 4215 on 7870  Progress: 4216 on 7870  Progress: 4217 on 7870  Progress: 4218 on 7870  Progress: 4219 on 7870  Progress: 4220 on 7870  Progress: 4221 on 7870  Progress: 4222 on 7870  Progress: 4223 on 7870  Progress: 4224 on 7870  Progress: 4225 on 7870  Progress: 4226 on 7870  Progress: 4227 on 7870  Progress: 4228 on 7870  Progress: 4229 on 7870  Progress: 4230 on 7870  Progress: 4231 on 7870  Progress: 4232 on 7870  Progress: 4233 on 7870  Progress: 4234 on 7870  Progress: 4235 on 7870  Progress: 4236 on 7870  Progress: 4237 on 7870  Progress: 4238 on 7870  Progress: 4239 on 7870  Progress: 4240 on 7870  Progress: 4241 on 7870  Progress: 4242 on 7870  Progress: 4243 on 7870  Progress: 4244 on 7870  Progress: 4245 on 7870  Progress: 4246 on 7870  Progress: 4247 on 7870  Progress: 4248 on 7870  Progress: 4249 on 7870  Progress: 4250 on 7870  Progress: 4251 on 7870  Progress: 4252 on 7870  Progress: 4253 on 7870  Progress: 4254 on 7870  Progress: 4255 on 7870  Progress: 4256 on 7870  Progress: 4257 on 7870  Progress: 4258 on 7870  Progress: 4259 on 7870  Progress: 4260 on 7870  Progress: 4261 on 7870  Progress: 4262 on 7870  Progress: 4263 on 7870  Progress: 4264 on 7870  Progress: 4265 on 7870  Progress: 4266 on 7870  Progress: 4267 on 7870  Progress: 4268 on 7870  Progress: 4269 on 7870  Progress: 4270 on 7870  Progress: 4271 on 7870  Progress: 4272 on 7870  Progress: 4273 on 7870  Progress: 4274 on 7870  Progress: 4275 on 7870  Progress: 4276 on 7870  Progress: 4277 on 7870  Progress: 4278 on 7870  Progress: 4279 on 7870  Progress: 4280 on 7870  Progress: 4281 on 7870  Progress: 4282 on 7870  Progress: 4283 on 7870  Progress: 4284 on 7870  Progress: 4285 on 7870  Progress: 4286 on 7870  Progress: 4287 on 7870  Progress: 4288 on 7870  Progress: 4289 on 7870  Progress: 4290 on 7870  Progress: 4291 on 7870  Progress: 4292 on 7870  Progress: 4293 on 7870  Progress: 4294 on 7870  Progress: 4295 on 7870  Progress: 4296 on 7870  Progress: 4297 on 7870  Progress: 4298 on 7870  Progress: 4299 on 7870  Progress: 4300 on 7870  Progress: 4301 on 7870  Progress: 4302 on 7870  Progress: 4303 on 7870  Progress: 4304 on 7870  Progress: 4305 on 7870  Progress: 4306 on 7870  Progress: 4307 on 7870  Progress: 4308 on 7870  Progress: 4309 on 7870  Progress: 4310 on 7870  Progress: 4311 on 7870  Progress: 4312 on 7870  Progress: 4313 on 7870  Progress: 4314 on 7870  Progress: 4315 on 7870  Progress: 4316 on 7870  Progress: 4317 on 7870  Progress: 4318 on 7870  Progress: 4319 on 7870  Progress: 4320 on 7870  Progress: 4321 on 7870  Progress: 4322 on 7870  Progress: 4323 on 7870  Progress: 4324 on 7870  Progress: 4325 on 7870  Progress: 4326 on 7870  Progress: 4327 on 7870  Progress: 4328 on 7870  Progress: 4329 on 7870  Progress: 4330 on 7870  Progress: 4331 on 7870  Progress: 4332 on 7870  Progress: 4333 on 7870  Progress: 4334 on 7870  Progress: 4335 on 7870  Progress: 4336 on 7870  Progress: 4337 on 7870  Progress: 4338 on 7870  Progress: 4339 on 7870  Progress: 4340 on 7870  Progress: 4341 on 7870  Progress: 4342 on 7870  Progress: 4343 on 7870  Progress: 4344 on 7870  Progress: 4345 on 7870  Progress: 4346 on 7870  Progress: 4347 on 7870  Progress: 4348 on 7870  Progress: 4349 on 7870  Progress: 4350 on 7870  Progress: 4351 on 7870  Progress: 4352 on 7870  Progress: 4353 on 7870  Progress: 4354 on 7870  Progress: 4355 on 7870  Progress: 4356 on 7870  Progress: 4357 on 7870  Progress: 4358 on 7870  Progress: 4359 on 7870  Progress: 4360 on 7870  Progress: 4361 on 7870  Progress: 4362 on 7870  Progress: 4363 on 7870  Progress: 4364 on 7870  Progress: 4365 on 7870  Progress: 4366 on 7870  Progress: 4367 on 7870  Progress: 4368 on 7870  Progress: 4369 on 7870  Progress: 4370 on 7870  Progress: 4371 on 7870  Progress: 4372 on 7870  Progress: 4373 on 7870  Progress: 4374 on 7870  Progress: 4375 on 7870  Progress: 4376 on 7870  Progress: 4377 on 7870  Progress: 4378 on 7870  Progress: 4379 on 7870  Progress: 4380 on 7870  Progress: 4381 on 7870  Progress: 4382 on 7870  Progress: 4383 on 7870  Progress: 4384 on 7870  Progress: 4385 on 7870  Progress: 4386 on 7870  Progress: 4387 on 7870  Progress: 4388 on 7870  Progress: 4389 on 7870  Progress: 4390 on 7870  Progress: 4391 on 7870  Progress: 4392 on 7870  Progress: 4393 on 7870  Progress: 4394 on 7870  Progress: 4395 on 7870  Progress: 4396 on 7870  Progress: 4397 on 7870  Progress: 4398 on 7870  Progress: 4399 on 7870  Progress: 4400 on 7870  Progress: 4401 on 7870  Progress: 4402 on 7870  Progress: 4403 on 7870  Progress: 4404 on 7870  Progress: 4405 on 7870  Progress: 4406 on 7870  Progress: 4407 on 7870  Progress: 4408 on 7870  Progress: 4409 on 7870  Progress: 4410 on 7870  Progress: 4411 on 7870  Progress: 4412 on 7870  Progress: 4413 on 7870  Progress: 4414 on 7870  Progress: 4415 on 7870  Progress: 4416 on 7870  Progress: 4417 on 7870  Progress: 4418 on 7870  Progress: 4419 on 7870  Progress: 4420 on 7870  Progress: 4421 on 7870  Progress: 4422 on 7870  Progress: 4423 on 7870  Progress: 4424 on 7870  Progress: 4425 on 7870  Progress: 4426 on 7870  Progress: 4427 on 7870  Progress: 4428 on 7870  Progress: 4429 on 7870  Progress: 4430 on 7870  Progress: 4431 on 7870  Progress: 4432 on 7870  Progress: 4433 on 7870  Progress: 4434 on 7870  Progress: 4435 on 7870  Progress: 4436 on 7870  Progress: 4437 on 7870  Progress: 4438 on 7870  Progress: 4439 on 7870  Progress: 4440 on 7870  Progress: 4441 on 7870  Progress: 4442 on 7870  Progress: 4443 on 7870  Progress: 4444 on 7870  Progress: 4445 on 7870  Progress: 4446 on 7870  Progress: 4447 on 7870  Progress: 4448 on 7870  Progress: 4449 on 7870  Progress: 4450 on 7870  Progress: 4451 on 7870  Progress: 4452 on 7870  Progress: 4453 on 7870  Progress: 4454 on 7870  Progress: 4455 on 7870  Progress: 4456 on 7870  Progress: 4457 on 7870  Progress: 4458 on 7870  Progress: 4459 on 7870  Progress: 4460 on 7870  Progress: 4461 on 7870  Progress: 4462 on 7870  Progress: 4463 on 7870  Progress: 4464 on 7870  Progress: 4465 on 7870  Progress: 4466 on 7870  Progress: 4467 on 7870  Progress: 4468 on 7870  Progress: 4469 on 7870  Progress: 4470 on 7870  Progress: 4471 on 7870  Progress: 4472 on 7870  Progress: 4473 on 7870  Progress: 4474 on 7870  Progress: 4475 on 7870  Progress: 4476 on 7870  Progress: 4477 on 7870  Progress: 4478 on 7870  Progress: 4479 on 7870  Progress: 4480 on 7870  Progress: 4481 on 7870  Progress: 4482 on 7870  Progress: 4483 on 7870  Progress: 4484 on 7870  Progress: 4485 on 7870  Progress: 4486 on 7870  Progress: 4487 on 7870  Progress: 4488 on 7870  Progress: 4489 on 7870  Progress: 4490 on 7870  Progress: 4491 on 7870  Progress: 4492 on 7870  Progress: 4493 on 7870  Progress: 4494 on 7870  Progress: 4495 on 7870  Progress: 4496 on 7870  Progress: 4497 on 7870  Progress: 4498 on 7870  Progress: 4499 on 7870  Progress: 4500 on 7870  Progress: 4501 on 7870  Progress: 4502 on 7870  Progress: 4503 on 7870  Progress: 4504 on 7870  Progress: 4505 on 7870  Progress: 4506 on 7870  Progress: 4507 on 7870  Progress: 4508 on 7870  Progress: 4509 on 7870  Progress: 4510 on 7870  Progress: 4511 on 7870  Progress: 4512 on 7870  Progress: 4513 on 7870  Progress: 4514 on 7870  Progress: 4515 on 7870  Progress: 4516 on 7870  Progress: 4517 on 7870  Progress: 4518 on 7870  Progress: 4519 on 7870  Progress: 4520 on 7870  Progress: 4521 on 7870  Progress: 4522 on 7870  Progress: 4523 on 7870  Progress: 4524 on 7870  Progress: 4525 on 7870  Progress: 4526 on 7870  Progress: 4527 on 7870  Progress: 4528 on 7870  Progress: 4529 on 7870  Progress: 4530 on 7870  Progress: 4531 on 7870  Progress: 4532 on 7870  Progress: 4533 on 7870  Progress: 4534 on 7870  Progress: 4535 on 7870  Progress: 4536 on 7870  Progress: 4537 on 7870  Progress: 4538 on 7870  Progress: 4539 on 7870  Progress: 4540 on 7870  Progress: 4541 on 7870  Progress: 4542 on 7870  Progress: 4543 on 7870  Progress: 4544 on 7870  Progress: 4545 on 7870  Progress: 4546 on 7870  Progress: 4547 on 7870  Progress: 4548 on 7870  Progress: 4549 on 7870  Progress: 4550 on 7870  Progress: 4551 on 7870  Progress: 4552 on 7870  Progress: 4553 on 7870  Progress: 4554 on 7870  Progress: 4555 on 7870  Progress: 4556 on 7870  Progress: 4557 on 7870  Progress: 4558 on 7870  Progress: 4559 on 7870  Progress: 4560 on 7870  Progress: 4561 on 7870  Progress: 4562 on 7870  Progress: 4563 on 7870  Progress: 4564 on 7870  Progress: 4565 on 7870  Progress: 4566 on 7870  Progress: 4567 on 7870  Progress: 4568 on 7870  Progress: 4569 on 7870  Progress: 4570 on 7870  Progress: 4571 on 7870  Progress: 4572 on 7870  Progress: 4573 on 7870  Progress: 4574 on 7870  Progress: 4575 on 7870  Progress: 4576 on 7870  Progress: 4577 on 7870  Progress: 4578 on 7870  Progress: 4579 on 7870  Progress: 4580 on 7870  Progress: 4581 on 7870  Progress: 4582 on 7870  Progress: 4583 on 7870  Progress: 4584 on 7870  Progress: 4585 on 7870  Progress: 4586 on 7870  Progress: 4587 on 7870  Progress: 4588 on 7870  Progress: 4589 on 7870  Progress: 4590 on 7870  Progress: 4591 on 7870  Progress: 4592 on 7870  Progress: 4593 on 7870  Progress: 4594 on 7870  Progress: 4595 on 7870  Progress: 4596 on 7870  Progress: 4597 on 7870  Progress: 4598 on 7870  Progress: 4599 on 7870  Progress: 4600 on 7870  Progress: 4601 on 7870  Progress: 4602 on 7870  Progress: 4603 on 7870  Progress: 4604 on 7870  Progress: 4605 on 7870  Progress: 4606 on 7870  Progress: 4607 on 7870  Progress: 4608 on 7870  Progress: 4609 on 7870  Progress: 4610 on 7870  Progress: 4611 on 7870  Progress: 4612 on 7870  Progress: 4613 on 7870  Progress: 4614 on 7870  Progress: 4615 on 7870  Progress: 4616 on 7870  Progress: 4617 on 7870  Progress: 4618 on 7870  Progress: 4619 on 7870  Progress: 4620 on 7870  Progress: 4621 on 7870  Progress: 4622 on 7870  Progress: 4623 on 7870  Progress: 4624 on 7870  Progress: 4625 on 7870  Progress: 4626 on 7870  Progress: 4627 on 7870  Progress: 4628 on 7870  Progress: 4629 on 7870  Progress: 4630 on 7870  Progress: 4631 on 7870  Progress: 4632 on 7870  Progress: 4633 on 7870  Progress: 4634 on 7870  Progress: 4635 on 7870  Progress: 4636 on 7870  Progress: 4637 on 7870  Progress: 4638 on 7870  Progress: 4639 on 7870  Progress: 4640 on 7870  Progress: 4641 on 7870  Progress: 4642 on 7870  Progress: 4643 on 7870  Progress: 4644 on 7870  Progress: 4645 on 7870  Progress: 4646 on 7870  Progress: 4647 on 7870  Progress: 4648 on 7870  Progress: 4649 on 7870  Progress: 4650 on 7870  Progress: 4651 on 7870  Progress: 4652 on 7870  Progress: 4653 on 7870  Progress: 4654 on 7870  Progress: 4655 on 7870  Progress: 4656 on 7870  Progress: 4657 on 7870  Progress: 4658 on 7870  Progress: 4659 on 7870  Progress: 4660 on 7870  Progress: 4661 on 7870  Progress: 4662 on 7870  Progress: 4663 on 7870  Progress: 4664 on 7870  Progress: 4665 on 7870  Progress: 4666 on 7870  Progress: 4667 on 7870  Progress: 4668 on 7870  Progress: 4669 on 7870  Progress: 4670 on 7870  Progress: 4671 on 7870  Progress: 4672 on 7870  Progress: 4673 on 7870  Progress: 4674 on 7870  Progress: 4675 on 7870  Progress: 4676 on 7870  Progress: 4677 on 7870  Progress: 4678 on 7870  Progress: 4679 on 7870  Progress: 4680 on 7870  Progress: 4681 on 7870  Progress: 4682 on 7870  Progress: 4683 on 7870  Progress: 4684 on 7870  Progress: 4685 on 7870  Progress: 4686 on 7870  Progress: 4687 on 7870  Progress: 4688 on 7870  Progress: 4689 on 7870  Progress: 4690 on 7870  Progress: 4691 on 7870  Progress: 4692 on 7870  Progress: 4693 on 7870  Progress: 4694 on 7870  Progress: 4695 on 7870  Progress: 4696 on 7870  Progress: 4697 on 7870  Progress: 4698 on 7870  Progress: 4699 on 7870  Progress: 4700 on 7870  Progress: 4701 on 7870  Progress: 4702 on 7870  Progress: 4703 on 7870  Progress: 4704 on 7870  Progress: 4705 on 7870  Progress: 4706 on 7870  Progress: 4707 on 7870  Progress: 4708 on 7870  Progress: 4709 on 7870  Progress: 4710 on 7870  Progress: 4711 on 7870  Progress: 4712 on 7870  Progress: 4713 on 7870  Progress: 4714 on 7870  Progress: 4715 on 7870  Progress: 4716 on 7870  Progress: 4717 on 7870  Progress: 4718 on 7870  Progress: 4719 on 7870  Progress: 4720 on 7870  Progress: 4721 on 7870  Progress: 4722 on 7870  Progress: 4723 on 7870  Progress: 4724 on 7870  Progress: 4725 on 7870  Progress: 4726 on 7870  Progress: 4727 on 7870  Progress: 4728 on 7870  Progress: 4729 on 7870  Progress: 4730 on 7870  Progress: 4731 on 7870  Progress: 4732 on 7870  Progress: 4733 on 7870  Progress: 4734 on 7870  Progress: 4735 on 7870  Progress: 4736 on 7870  Progress: 4737 on 7870  Progress: 4738 on 7870  Progress: 4739 on 7870  Progress: 4740 on 7870  Progress: 4741 on 7870  Progress: 4742 on 7870  Progress: 4743 on 7870  Progress: 4744 on 7870  Progress: 4745 on 7870  Progress: 4746 on 7870  Progress: 4747 on 7870  Progress: 4748 on 7870  Progress: 4749 on 7870  Progress: 4750 on 7870  Progress: 4751 on 7870  Progress: 4752 on 7870  Progress: 4753 on 7870  Progress: 4754 on 7870  Progress: 4755 on 7870  Progress: 4756 on 7870  Progress: 4757 on 7870  Progress: 4758 on 7870  Progress: 4759 on 7870  Progress: 4760 on 7870  Progress: 4761 on 7870  Progress: 4762 on 7870  Progress: 4763 on 7870  Progress: 4764 on 7870  Progress: 4765 on 7870  Progress: 4766 on 7870  Progress: 4767 on 7870  Progress: 4768 on 7870  Progress: 4769 on 7870  Progress: 4770 on 7870  Progress: 4771 on 7870  Progress: 4772 on 7870  Progress: 4773 on 7870  Progress: 4774 on 7870  Progress: 4775 on 7870  Progress: 4776 on 7870  Progress: 4777 on 7870  Progress: 4778 on 7870  Progress: 4779 on 7870  Progress: 4780 on 7870  Progress: 4781 on 7870  Progress: 4782 on 7870  Progress: 4783 on 7870  Progress: 4784 on 7870  Progress: 4785 on 7870  Progress: 4786 on 7870  Progress: 4787 on 7870  Progress: 4788 on 7870  Progress: 4789 on 7870  Progress: 4790 on 7870  Progress: 4791 on 7870  Progress: 4792 on 7870  Progress: 4793 on 7870  Progress: 4794 on 7870  Progress: 4795 on 7870  Progress: 4796 on 7870  Progress: 4797 on 7870  Progress: 4798 on 7870  Progress: 4799 on 7870  Progress: 4800 on 7870  Progress: 4801 on 7870  Progress: 4802 on 7870  Progress: 4803 on 7870  Progress: 4804 on 7870  Progress: 4805 on 7870  Progress: 4806 on 7870  Progress: 4807 on 7870  Progress: 4808 on 7870  Progress: 4809 on 7870  Progress: 4810 on 7870  Progress: 4811 on 7870  Progress: 4812 on 7870  Progress: 4813 on 7870  Progress: 4814 on 7870  Progress: 4815 on 7870  Progress: 4816 on 7870  Progress: 4817 on 7870  Progress: 4818 on 7870  Progress: 4819 on 7870  Progress: 4820 on 7870  Progress: 4821 on 7870  Progress: 4822 on 7870  Progress: 4823 on 7870  Progress: 4824 on 7870  Progress: 4825 on 7870  Progress: 4826 on 7870  Progress: 4827 on 7870  Progress: 4828 on 7870  Progress: 4829 on 7870  Progress: 4830 on 7870  Progress: 4831 on 7870  Progress: 4832 on 7870  Progress: 4833 on 7870  Progress: 4834 on 7870  Progress: 4835 on 7870  Progress: 4836 on 7870  Progress: 4837 on 7870  Progress: 4838 on 7870  Progress: 4839 on 7870  Progress: 4840 on 7870  Progress: 4841 on 7870  Progress: 4842 on 7870  Progress: 4843 on 7870  Progress: 4844 on 7870  Progress: 4845 on 7870  Progress: 4846 on 7870  Progress: 4847 on 7870  Progress: 4848 on 7870  Progress: 4849 on 7870  Progress: 4850 on 7870  Progress: 4851 on 7870  Progress: 4852 on 7870  Progress: 4853 on 7870  Progress: 4854 on 7870  Progress: 4855 on 7870  Progress: 4856 on 7870  Progress: 4857 on 7870  Progress: 4858 on 7870  Progress: 4859 on 7870  Progress: 4860 on 7870  Progress: 4861 on 7870  Progress: 4862 on 7870  Progress: 4863 on 7870  Progress: 4864 on 7870  Progress: 4865 on 7870  Progress: 4866 on 7870  Progress: 4867 on 7870  Progress: 4868 on 7870  Progress: 4869 on 7870  Progress: 4870 on 7870  Progress: 4871 on 7870  Progress: 4872 on 7870  Progress: 4873 on 7870  Progress: 4874 on 7870  Progress: 4875 on 7870  Progress: 4876 on 7870  Progress: 4877 on 7870  Progress: 4878 on 7870  Progress: 4879 on 7870  Progress: 4880 on 7870  Progress: 4881 on 7870  Progress: 4882 on 7870  Progress: 4883 on 7870  Progress: 4884 on 7870  Progress: 4885 on 7870  Progress: 4886 on 7870  Progress: 4887 on 7870  Progress: 4888 on 7870  Progress: 4889 on 7870  Progress: 4890 on 7870  Progress: 4891 on 7870  Progress: 4892 on 7870  Progress: 4893 on 7870  Progress: 4894 on 7870  Progress: 4895 on 7870  Progress: 4896 on 7870  Progress: 4897 on 7870  Progress: 4898 on 7870  Progress: 4899 on 7870  Progress: 4900 on 7870  Progress: 4901 on 7870  Progress: 4902 on 7870  Progress: 4903 on 7870  Progress: 4904 on 7870  Progress: 4905 on 7870  Progress: 4906 on 7870  Progress: 4907 on 7870  Progress: 4908 on 7870  Progress: 4909 on 7870  Progress: 4910 on 7870  Progress: 4911 on 7870  Progress: 4912 on 7870  Progress: 4913 on 7870  Progress: 4914 on 7870  Progress: 4915 on 7870  Progress: 4916 on 7870  Progress: 4917 on 7870  Progress: 4918 on 7870  Progress: 4919 on 7870  Progress: 4920 on 7870  Progress: 4921 on 7870  Progress: 4922 on 7870  Progress: 4923 on 7870  Progress: 4924 on 7870  Progress: 4925 on 7870  Progress: 4926 on 7870  Progress: 4927 on 7870  Progress: 4928 on 7870  Progress: 4929 on 7870  Progress: 4930 on 7870  Progress: 4931 on 7870  Progress: 4932 on 7870  Progress: 4933 on 7870  Progress: 4934 on 7870  Progress: 4935 on 7870  Progress: 4936 on 7870  Progress: 4937 on 7870  Progress: 4938 on 7870  Progress: 4939 on 7870  Progress: 4940 on 7870  Progress: 4941 on 7870  Progress: 4942 on 7870  Progress: 4943 on 7870  Progress: 4944 on 7870  Progress: 4945 on 7870  Progress: 4946 on 7870  Progress: 4947 on 7870  Progress: 4948 on 7870  Progress: 4949 on 7870  Progress: 4950 on 7870  Progress: 4951 on 7870  Progress: 4952 on 7870  Progress: 4953 on 7870  Progress: 4954 on 7870  Progress: 4955 on 7870  Progress: 4956 on 7870  Progress: 4957 on 7870  Progress: 4958 on 7870  Progress: 4959 on 7870  Progress: 4960 on 7870  Progress: 4961 on 7870  Progress: 4962 on 7870  Progress: 4963 on 7870  Progress: 4964 on 7870  Progress: 4965 on 7870  Progress: 4966 on 7870  Progress: 4967 on 7870  Progress: 4968 on 7870  Progress: 4969 on 7870  Progress: 4970 on 7870  Progress: 4971 on 7870  Progress: 4972 on 7870  Progress: 4973 on 7870  Progress: 4974 on 7870  Progress: 4975 on 7870  Progress: 4976 on 7870  Progress: 4977 on 7870  Progress: 4978 on 7870  Progress: 4979 on 7870  Progress: 4980 on 7870  Progress: 4981 on 7870  Progress: 4982 on 7870  Progress: 4983 on 7870  Progress: 4984 on 7870  Progress: 4985 on 7870  Progress: 4986 on 7870  Progress: 4987 on 7870  Progress: 4988 on 7870  Progress: 4989 on 7870  Progress: 4990 on 7870  Progress: 4991 on 7870  Progress: 4992 on 7870  Progress: 4993 on 7870  Progress: 4994 on 7870  Progress: 4995 on 7870  Progress: 4996 on 7870  Progress: 4997 on 7870  Progress: 4998 on 7870  Progress: 4999 on 7870  Progress: 5000 on 7870  Progress: 5001 on 7870  Progress: 5002 on 7870  Progress: 5003 on 7870  Progress: 5004 on 7870  Progress: 5005 on 7870  Progress: 5006 on 7870  Progress: 5007 on 7870  Progress: 5008 on 7870  Progress: 5009 on 7870  Progress: 5010 on 7870  Progress: 5011 on 7870  Progress: 5012 on 7870  Progress: 5013 on 7870  Progress: 5014 on 7870  Progress: 5015 on 7870  Progress: 5016 on 7870  Progress: 5017 on 7870  Progress: 5018 on 7870  Progress: 5019 on 7870  Progress: 5020 on 7870  Progress: 5021 on 7870  Progress: 5022 on 7870  Progress: 5023 on 7870  Progress: 5024 on 7870  Progress: 5025 on 7870  Progress: 5026 on 7870  Progress: 5027 on 7870  Progress: 5028 on 7870  Progress: 5029 on 7870  Progress: 5030 on 7870  Progress: 5031 on 7870  Progress: 5032 on 7870  Progress: 5033 on 7870  Progress: 5034 on 7870  Progress: 5035 on 7870  Progress: 5036 on 7870  Progress: 5037 on 7870  Progress: 5038 on 7870  Progress: 5039 on 7870  Progress: 5040 on 7870  Progress: 5041 on 7870  Progress: 5042 on 7870  Progress: 5043 on 7870  Progress: 5044 on 7870  Progress: 5045 on 7870  Progress: 5046 on 7870  Progress: 5047 on 7870  Progress: 5048 on 7870  Progress: 5049 on 7870  Progress: 5050 on 7870  Progress: 5051 on 7870  Progress: 5052 on 7870  Progress: 5053 on 7870  Progress: 5054 on 7870  Progress: 5055 on 7870  Progress: 5056 on 7870  Progress: 5057 on 7870  Progress: 5058 on 7870  Progress: 5059 on 7870  Progress: 5060 on 7870  Progress: 5061 on 7870  Progress: 5062 on 7870  Progress: 5063 on 7870  Progress: 5064 on 7870  Progress: 5065 on 7870  Progress: 5066 on 7870  Progress: 5067 on 7870  Progress: 5068 on 7870  Progress: 5069 on 7870  Progress: 5070 on 7870  Progress: 5071 on 7870  Progress: 5072 on 7870  Progress: 5073 on 7870  Progress: 5074 on 7870  Progress: 5075 on 7870  Progress: 5076 on 7870  Progress: 5077 on 7870  Progress: 5078 on 7870  Progress: 5079 on 7870  Progress: 5080 on 7870  Progress: 5081 on 7870  Progress: 5082 on 7870  Progress: 5083 on 7870  Progress: 5084 on 7870  Progress: 5085 on 7870  Progress: 5086 on 7870  Progress: 5087 on 7870  Progress: 5088 on 7870  Progress: 5089 on 7870  Progress: 5090 on 7870  Progress: 5091 on 7870  Progress: 5092 on 7870  Progress: 5093 on 7870  Progress: 5094 on 7870  Progress: 5095 on 7870  Progress: 5096 on 7870  Progress: 5097 on 7870  Progress: 5098 on 7870  Progress: 5099 on 7870  Progress: 5100 on 7870  Progress: 5101 on 7870  Progress: 5102 on 7870  Progress: 5103 on 7870  Progress: 5104 on 7870  Progress: 5105 on 7870  Progress: 5106 on 7870  Progress: 5107 on 7870  Progress: 5108 on 7870  Progress: 5109 on 7870  Progress: 5110 on 7870  Progress: 5111 on 7870  Progress: 5112 on 7870  Progress: 5113 on 7870  Progress: 5114 on 7870  Progress: 5115 on 7870  Progress: 5116 on 7870  Progress: 5117 on 7870  Progress: 5118 on 7870  Progress: 5119 on 7870  Progress: 5120 on 7870  Progress: 5121 on 7870  Progress: 5122 on 7870  Progress: 5123 on 7870  Progress: 5124 on 7870  Progress: 5125 on 7870  Progress: 5126 on 7870  Progress: 5127 on 7870  Progress: 5128 on 7870  Progress: 5129 on 7870  Progress: 5130 on 7870  Progress: 5131 on 7870  Progress: 5132 on 7870  Progress: 5133 on 7870  Progress: 5134 on 7870  Progress: 5135 on 7870  Progress: 5136 on 7870  Progress: 5137 on 7870  Progress: 5138 on 7870  Progress: 5139 on 7870  Progress: 5140 on 7870  Progress: 5141 on 7870  Progress: 5142 on 7870  Progress: 5143 on 7870  Progress: 5144 on 7870  Progress: 5145 on 7870  Progress: 5146 on 7870  Progress: 5147 on 7870  Progress: 5148 on 7870  Progress: 5149 on 7870  Progress: 5150 on 7870  Progress: 5151 on 7870  Progress: 5152 on 7870  Progress: 5153 on 7870  Progress: 5154 on 7870  Progress: 5155 on 7870  Progress: 5156 on 7870  Progress: 5157 on 7870  Progress: 5158 on 7870  Progress: 5159 on 7870  Progress: 5160 on 7870  Progress: 5161 on 7870  Progress: 5162 on 7870  Progress: 5163 on 7870  Progress: 5164 on 7870  Progress: 5165 on 7870  Progress: 5166 on 7870  Progress: 5167 on 7870  Progress: 5168 on 7870  Progress: 5169 on 7870  Progress: 5170 on 7870  Progress: 5171 on 7870  Progress: 5172 on 7870  Progress: 5173 on 7870  Progress: 5174 on 7870  Progress: 5175 on 7870  Progress: 5176 on 7870  Progress: 5177 on 7870  Progress: 5178 on 7870  Progress: 5179 on 7870  Progress: 5180 on 7870  Progress: 5181 on 7870  Progress: 5182 on 7870  Progress: 5183 on 7870  Progress: 5184 on 7870  Progress: 5185 on 7870  Progress: 5186 on 7870  Progress: 5187 on 7870  Progress: 5188 on 7870  Progress: 5189 on 7870  Progress: 5190 on 7870  Progress: 5191 on 7870  Progress: 5192 on 7870  Progress: 5193 on 7870  Progress: 5194 on 7870  Progress: 5195 on 7870  Progress: 5196 on 7870  Progress: 5197 on 7870  Progress: 5198 on 7870  Progress: 5199 on 7870  Progress: 5200 on 7870  Progress: 5201 on 7870  Progress: 5202 on 7870  Progress: 5203 on 7870  Progress: 5204 on 7870  Progress: 5205 on 7870  Progress: 5206 on 7870  Progress: 5207 on 7870  Progress: 5208 on 7870  Progress: 5209 on 7870  Progress: 5210 on 7870  Progress: 5211 on 7870  Progress: 5212 on 7870  Progress: 5213 on 7870  Progress: 5214 on 7870  Progress: 5215 on 7870  Progress: 5216 on 7870  Progress: 5217 on 7870  Progress: 5218 on 7870  Progress: 5219 on 7870  Progress: 5220 on 7870  Progress: 5221 on 7870  Progress: 5222 on 7870  Progress: 5223 on 7870  Progress: 5224 on 7870  Progress: 5225 on 7870  Progress: 5226 on 7870  Progress: 5227 on 7870  Progress: 5228 on 7870  Progress: 5229 on 7870  Progress: 5230 on 7870  Progress: 5231 on 7870  Progress: 5232 on 7870  Progress: 5233 on 7870  Progress: 5234 on 7870  Progress: 5235 on 7870  Progress: 5236 on 7870  Progress: 5237 on 7870  Progress: 5238 on 7870  Progress: 5239 on 7870  Progress: 5240 on 7870  Progress: 5241 on 7870  Progress: 5242 on 7870  Progress: 5243 on 7870  Progress: 5244 on 7870  Progress: 5245 on 7870  Progress: 5246 on 7870  Progress: 5247 on 7870  Progress: 5248 on 7870  Progress: 5249 on 7870  Progress: 5250 on 7870  Progress: 5251 on 7870  Progress: 5252 on 7870  Progress: 5253 on 7870  Progress: 5254 on 7870  Progress: 5255 on 7870  Progress: 5256 on 7870  Progress: 5257 on 7870  Progress: 5258 on 7870  Progress: 5259 on 7870  Progress: 5260 on 7870  Progress: 5261 on 7870  Progress: 5262 on 7870  Progress: 5263 on 7870  Progress: 5264 on 7870  Progress: 5265 on 7870  Progress: 5266 on 7870  Progress: 5267 on 7870  Progress: 5268 on 7870  Progress: 5269 on 7870  Progress: 5270 on 7870  Progress: 5271 on 7870  Progress: 5272 on 7870  Progress: 5273 on 7870  Progress: 5274 on 7870  Progress: 5275 on 7870  Progress: 5276 on 7870  Progress: 5277 on 7870  Progress: 5278 on 7870  Progress: 5279 on 7870  Progress: 5280 on 7870  Progress: 5281 on 7870  Progress: 5282 on 7870  Progress: 5283 on 7870  Progress: 5284 on 7870  Progress: 5285 on 7870  Progress: 5286 on 7870  Progress: 5287 on 7870  Progress: 5288 on 7870  Progress: 5289 on 7870  Progress: 5290 on 7870  Progress: 5291 on 7870  Progress: 5292 on 7870  Progress: 5293 on 7870  Progress: 5294 on 7870  Progress: 5295 on 7870  Progress: 5296 on 7870  Progress: 5297 on 7870  Progress: 5298 on 7870  Progress: 5299 on 7870  Progress: 5300 on 7870  Progress: 5301 on 7870  Progress: 5302 on 7870  Progress: 5303 on 7870  Progress: 5304 on 7870  Progress: 5305 on 7870  Progress: 5306 on 7870  Progress: 5307 on 7870  Progress: 5308 on 7870  Progress: 5309 on 7870  Progress: 5310 on 7870  Progress: 5311 on 7870  Progress: 5312 on 7870  Progress: 5313 on 7870  Progress: 5314 on 7870  Progress: 5315 on 7870  Progress: 5316 on 7870  Progress: 5317 on 7870  Progress: 5318 on 7870  Progress: 5319 on 7870  Progress: 5320 on 7870  Progress: 5321 on 7870  Progress: 5322 on 7870  Progress: 5323 on 7870  Progress: 5324 on 7870  Progress: 5325 on 7870  Progress: 5326 on 7870  Progress: 5327 on 7870  Progress: 5328 on 7870  Progress: 5329 on 7870  Progress: 5330 on 7870  Progress: 5331 on 7870  Progress: 5332 on 7870  Progress: 5333 on 7870  Progress: 5334 on 7870  Progress: 5335 on 7870  Progress: 5336 on 7870  Progress: 5337 on 7870  Progress: 5338 on 7870  Progress: 5339 on 7870  Progress: 5340 on 7870  Progress: 5341 on 7870  Progress: 5342 on 7870  Progress: 5343 on 7870  Progress: 5344 on 7870  Progress: 5345 on 7870  Progress: 5346 on 7870  Progress: 5347 on 7870  Progress: 5348 on 7870  Progress: 5349 on 7870  Progress: 5350 on 7870  Progress: 5351 on 7870  Progress: 5352 on 7870  Progress: 5353 on 7870  Progress: 5354 on 7870  Progress: 5355 on 7870  Progress: 5356 on 7870  Progress: 5357 on 7870  Progress: 5358 on 7870  Progress: 5359 on 7870  Progress: 5360 on 7870  Progress: 5361 on 7870  Progress: 5362 on 7870  Progress: 5363 on 7870  Progress: 5364 on 7870  Progress: 5365 on 7870  Progress: 5366 on 7870  Progress: 5367 on 7870  Progress: 5368 on 7870  Progress: 5369 on 7870  Progress: 5370 on 7870  Progress: 5371 on 7870  Progress: 5372 on 7870  Progress: 5373 on 7870  Progress: 5374 on 7870  Progress: 5375 on 7870  Progress: 5376 on 7870  Progress: 5377 on 7870  Progress: 5378 on 7870  Progress: 5379 on 7870  Progress: 5380 on 7870  Progress: 5381 on 7870  Progress: 5382 on 7870  Progress: 5383 on 7870  Progress: 5384 on 7870  Progress: 5385 on 7870  Progress: 5386 on 7870  Progress: 5387 on 7870  Progress: 5388 on 7870  Progress: 5389 on 7870  Progress: 5390 on 7870  Progress: 5391 on 7870  Progress: 5392 on 7870  Progress: 5393 on 7870  Progress: 5394 on 7870  Progress: 5395 on 7870  Progress: 5396 on 7870  Progress: 5397 on 7870  Progress: 5398 on 7870  Progress: 5399 on 7870  Progress: 5400 on 7870  Progress: 5401 on 7870  Progress: 5402 on 7870  Progress: 5403 on 7870  Progress: 5404 on 7870  Progress: 5405 on 7870  Progress: 5406 on 7870  Progress: 5407 on 7870  Progress: 5408 on 7870  Progress: 5409 on 7870  Progress: 5410 on 7870  Progress: 5411 on 7870  Progress: 5412 on 7870  Progress: 5413 on 7870  Progress: 5414 on 7870  Progress: 5415 on 7870  Progress: 5416 on 7870  Progress: 5417 on 7870  Progress: 5418 on 7870  Progress: 5419 on 7870  Progress: 5420 on 7870  Progress: 5421 on 7870  Progress: 5422 on 7870  Progress: 5423 on 7870  Progress: 5424 on 7870  Progress: 5425 on 7870  Progress: 5426 on 7870  Progress: 5427 on 7870  Progress: 5428 on 7870  Progress: 5429 on 7870  Progress: 5430 on 7870  Progress: 5431 on 7870  Progress: 5432 on 7870  Progress: 5433 on 7870  Progress: 5434 on 7870  Progress: 5435 on 7870  Progress: 5436 on 7870  Progress: 5437 on 7870  Progress: 5438 on 7870  Progress: 5439 on 7870  Progress: 5440 on 7870  Progress: 5441 on 7870  Progress: 5442 on 7870  Progress: 5443 on 7870  Progress: 5444 on 7870  Progress: 5445 on 7870  Progress: 5446 on 7870  Progress: 5447 on 7870  Progress: 5448 on 7870  Progress: 5449 on 7870  Progress: 5450 on 7870  Progress: 5451 on 7870  Progress: 5452 on 7870  Progress: 5453 on 7870  Progress: 5454 on 7870  Progress: 5455 on 7870  Progress: 5456 on 7870  Progress: 5457 on 7870  Progress: 5458 on 7870  Progress: 5459 on 7870  Progress: 5460 on 7870  Progress: 5461 on 7870  Progress: 5462 on 7870  Progress: 5463 on 7870  Progress: 5464 on 7870  Progress: 5465 on 7870  Progress: 5466 on 7870  Progress: 5467 on 7870  Progress: 5468 on 7870  Progress: 5469 on 7870  Progress: 5470 on 7870  Progress: 5471 on 7870  Progress: 5472 on 7870  Progress: 5473 on 7870  Progress: 5474 on 7870  Progress: 5475 on 7870  Progress: 5476 on 7870  Progress: 5477 on 7870  Progress: 5478 on 7870  Progress: 5479 on 7870  Progress: 5480 on 7870  Progress: 5481 on 7870  Progress: 5482 on 7870  Progress: 5483 on 7870  Progress: 5484 on 7870  Progress: 5485 on 7870  Progress: 5486 on 7870  Progress: 5487 on 7870  Progress: 5488 on 7870  Progress: 5489 on 7870  Progress: 5490 on 7870  Progress: 5491 on 7870  Progress: 5492 on 7870  Progress: 5493 on 7870  Progress: 5494 on 7870  Progress: 5495 on 7870  Progress: 5496 on 7870  Progress: 5497 on 7870  Progress: 5498 on 7870  Progress: 5499 on 7870  Progress: 5500 on 7870  Progress: 5501 on 7870  Progress: 5502 on 7870  Progress: 5503 on 7870  Progress: 5504 on 7870  Progress: 5505 on 7870  Progress: 5506 on 7870  Progress: 5507 on 7870  Progress: 5508 on 7870  Progress: 5509 on 7870  Progress: 5510 on 7870  Progress: 5511 on 7870  Progress: 5512 on 7870  Progress: 5513 on 7870  Progress: 5514 on 7870  Progress: 5515 on 7870  Progress: 5516 on 7870  Progress: 5517 on 7870  Progress: 5518 on 7870  Progress: 5519 on 7870  Progress: 5520 on 7870  Progress: 5521 on 7870  Progress: 5522 on 7870  Progress: 5523 on 7870  Progress: 5524 on 7870  Progress: 5525 on 7870  Progress: 5526 on 7870  Progress: 5527 on 7870  Progress: 5528 on 7870  Progress: 5529 on 7870  Progress: 5530 on 7870  Progress: 5531 on 7870  Progress: 5532 on 7870  Progress: 5533 on 7870  Progress: 5534 on 7870  Progress: 5535 on 7870  Progress: 5536 on 7870  Progress: 5537 on 7870  Progress: 5538 on 7870  Progress: 5539 on 7870  Progress: 5540 on 7870  Progress: 5541 on 7870  Progress: 5542 on 7870  Progress: 5543 on 7870  Progress: 5544 on 7870  Progress: 5545 on 7870  Progress: 5546 on 7870  Progress: 5547 on 7870  Progress: 5548 on 7870  Progress: 5549 on 7870  Progress: 5550 on 7870  Progress: 5551 on 7870  Progress: 5552 on 7870  Progress: 5553 on 7870  Progress: 5554 on 7870  Progress: 5555 on 7870  Progress: 5556 on 7870  Progress: 5557 on 7870  Progress: 5558 on 7870  Progress: 5559 on 7870  Progress: 5560 on 7870  Progress: 5561 on 7870  Progress: 5562 on 7870  Progress: 5563 on 7870  Progress: 5564 on 7870  Progress: 5565 on 7870  Progress: 5566 on 7870  Progress: 5567 on 7870  Progress: 5568 on 7870  Progress: 5569 on 7870  Progress: 5570 on 7870  Progress: 5571 on 7870  Progress: 5572 on 7870  Progress: 5573 on 7870  Progress: 5574 on 7870  Progress: 5575 on 7870  Progress: 5576 on 7870  Progress: 5577 on 7870  Progress: 5578 on 7870  Progress: 5579 on 7870  Progress: 5580 on 7870  Progress: 5581 on 7870  Progress: 5582 on 7870  Progress: 5583 on 7870  Progress: 5584 on 7870  Progress: 5585 on 7870  Progress: 5586 on 7870  Progress: 5587 on 7870  Progress: 5588 on 7870  Progress: 5589 on 7870  Progress: 5590 on 7870  Progress: 5591 on 7870  Progress: 5592 on 7870  Progress: 5593 on 7870  Progress: 5594 on 7870  Progress: 5595 on 7870  Progress: 5596 on 7870  Progress: 5597 on 7870  Progress: 5598 on 7870  Progress: 5599 on 7870  Progress: 5600 on 7870  Progress: 5601 on 7870  Progress: 5602 on 7870  Progress: 5603 on 7870  Progress: 5604 on 7870  Progress: 5605 on 7870  Progress: 5606 on 7870  Progress: 5607 on 7870  Progress: 5608 on 7870  Progress: 5609 on 7870  Progress: 5610 on 7870  Progress: 5611 on 7870  Progress: 5612 on 7870  Progress: 5613 on 7870  Progress: 5614 on 7870  Progress: 5615 on 7870  Progress: 5616 on 7870  Progress: 5617 on 7870  Progress: 5618 on 7870  Progress: 5619 on 7870  Progress: 5620 on 7870  Progress: 5621 on 7870  Progress: 5622 on 7870  Progress: 5623 on 7870  Progress: 5624 on 7870  Progress: 5625 on 7870  Progress: 5626 on 7870  Progress: 5627 on 7870  Progress: 5628 on 7870  Progress: 5629 on 7870  Progress: 5630 on 7870  Progress: 5631 on 7870  Progress: 5632 on 7870  Progress: 5633 on 7870  Progress: 5634 on 7870  Progress: 5635 on 7870  Progress: 5636 on 7870  Progress: 5637 on 7870  Progress: 5638 on 7870  Progress: 5639 on 7870  Progress: 5640 on 7870  Progress: 5641 on 7870  Progress: 5642 on 7870  Progress: 5643 on 7870  Progress: 5644 on 7870  Progress: 5645 on 7870  Progress: 5646 on 7870  Progress: 5647 on 7870  Progress: 5648 on 7870  Progress: 5649 on 7870  Progress: 5650 on 7870  Progress: 5651 on 7870  Progress: 5652 on 7870  Progress: 5653 on 7870  Progress: 5654 on 7870  Progress: 5655 on 7870  Progress: 5656 on 7870  Progress: 5657 on 7870  Progress: 5658 on 7870  Progress: 5659 on 7870  Progress: 5660 on 7870  Progress: 5661 on 7870  Progress: 5662 on 7870  Progress: 5663 on 7870  Progress: 5664 on 7870  Progress: 5665 on 7870  Progress: 5666 on 7870  Progress: 5667 on 7870  Progress: 5668 on 7870  Progress: 5669 on 7870  Progress: 5670 on 7870  Progress: 5671 on 7870  Progress: 5672 on 7870  Progress: 5673 on 7870  Progress: 5674 on 7870  Progress: 5675 on 7870  Progress: 5676 on 7870  Progress: 5677 on 7870  Progress: 5678 on 7870  Progress: 5679 on 7870  Progress: 5680 on 7870  Progress: 5681 on 7870  Progress: 5682 on 7870  Progress: 5683 on 7870  Progress: 5684 on 7870  Progress: 5685 on 7870  Progress: 5686 on 7870  Progress: 5687 on 7870  Progress: 5688 on 7870  Progress: 5689 on 7870  Progress: 5690 on 7870  Progress: 5691 on 7870  Progress: 5692 on 7870  Progress: 5693 on 7870  Progress: 5694 on 7870  Progress: 5695 on 7870  Progress: 5696 on 7870  Progress: 5697 on 7870  Progress: 5698 on 7870  Progress: 5699 on 7870  Progress: 5700 on 7870  Progress: 5701 on 7870  Progress: 5702 on 7870  Progress: 5703 on 7870  Progress: 5704 on 7870  Progress: 5705 on 7870  Progress: 5706 on 7870  Progress: 5707 on 7870  Progress: 5708 on 7870  Progress: 5709 on 7870  Progress: 5710 on 7870  Progress: 5711 on 7870  Progress: 5712 on 7870  Progress: 5713 on 7870  Progress: 5714 on 7870  Progress: 5715 on 7870  Progress: 5716 on 7870  Progress: 5717 on 7870  Progress: 5718 on 7870  Progress: 5719 on 7870  Progress: 5720 on 7870  Progress: 5721 on 7870  Progress: 5722 on 7870  Progress: 5723 on 7870  Progress: 5724 on 7870  Progress: 5725 on 7870  Progress: 5726 on 7870  Progress: 5727 on 7870  Progress: 5728 on 7870  Progress: 5729 on 7870  Progress: 5730 on 7870  Progress: 5731 on 7870  Progress: 5732 on 7870  Progress: 5733 on 7870  Progress: 5734 on 7870  Progress: 5735 on 7870  Progress: 5736 on 7870  Progress: 5737 on 7870  Progress: 5738 on 7870  Progress: 5739 on 7870  Progress: 5740 on 7870  Progress: 5741 on 7870  Progress: 5742 on 7870  Progress: 5743 on 7870  Progress: 5744 on 7870  Progress: 5745 on 7870  Progress: 5746 on 7870  Progress: 5747 on 7870  Progress: 5748 on 7870  Progress: 5749 on 7870  Progress: 5750 on 7870  Progress: 5751 on 7870  Progress: 5752 on 7870  Progress: 5753 on 7870  Progress: 5754 on 7870  Progress: 5755 on 7870  Progress: 5756 on 7870  Progress: 5757 on 7870  Progress: 5758 on 7870  Progress: 5759 on 7870  Progress: 5760 on 7870  Progress: 5761 on 7870  Progress: 5762 on 7870  Progress: 5763 on 7870  Progress: 5764 on 7870  Progress: 5765 on 7870  Progress: 5766 on 7870  Progress: 5767 on 7870  Progress: 5768 on 7870  Progress: 5769 on 7870  Progress: 5770 on 7870  Progress: 5771 on 7870  Progress: 5772 on 7870  Progress: 5773 on 7870  Progress: 5774 on 7870  Progress: 5775 on 7870  Progress: 5776 on 7870  Progress: 5777 on 7870  Progress: 5778 on 7870  Progress: 5779 on 7870  Progress: 5780 on 7870  Progress: 5781 on 7870  Progress: 5782 on 7870  Progress: 5783 on 7870  Progress: 5784 on 7870  Progress: 5785 on 7870  Progress: 5786 on 7870  Progress: 5787 on 7870  Progress: 5788 on 7870  Progress: 5789 on 7870  Progress: 5790 on 7870  Progress: 5791 on 7870  Progress: 5792 on 7870  Progress: 5793 on 7870  Progress: 5794 on 7870  Progress: 5795 on 7870  Progress: 5796 on 7870  Progress: 5797 on 7870  Progress: 5798 on 7870  Progress: 5799 on 7870  Progress: 5800 on 7870  Progress: 5801 on 7870  Progress: 5802 on 7870  Progress: 5803 on 7870  Progress: 5804 on 7870  Progress: 5805 on 7870  Progress: 5806 on 7870  Progress: 5807 on 7870  Progress: 5808 on 7870  Progress: 5809 on 7870  Progress: 5810 on 7870  Progress: 5811 on 7870  Progress: 5812 on 7870  Progress: 5813 on 7870  Progress: 5814 on 7870  Progress: 5815 on 7870  Progress: 5816 on 7870  Progress: 5817 on 7870  Progress: 5818 on 7870  Progress: 5819 on 7870  Progress: 5820 on 7870  Progress: 5821 on 7870  Progress: 5822 on 7870  Progress: 5823 on 7870  Progress: 5824 on 7870  Progress: 5825 on 7870  Progress: 5826 on 7870  Progress: 5827 on 7870  Progress: 5828 on 7870  Progress: 5829 on 7870  Progress: 5830 on 7870  Progress: 5831 on 7870  Progress: 5832 on 7870  Progress: 5833 on 7870  Progress: 5834 on 7870  Progress: 5835 on 7870  Progress: 5836 on 7870  Progress: 5837 on 7870  Progress: 5838 on 7870  Progress: 5839 on 7870  Progress: 5840 on 7870  Progress: 5841 on 7870  Progress: 5842 on 7870  Progress: 5843 on 7870  Progress: 5844 on 7870  Progress: 5845 on 7870  Progress: 5846 on 7870  Progress: 5847 on 7870  Progress: 5848 on 7870  Progress: 5849 on 7870  Progress: 5850 on 7870  Progress: 5851 on 7870  Progress: 5852 on 7870  Progress: 5853 on 7870  Progress: 5854 on 7870  Progress: 5855 on 7870  Progress: 5856 on 7870  Progress: 5857 on 7870  Progress: 5858 on 7870  Progress: 5859 on 7870  Progress: 5860 on 7870  Progress: 5861 on 7870  Progress: 5862 on 7870  Progress: 5863 on 7870  Progress: 5864 on 7870  Progress: 5865 on 7870  Progress: 5866 on 7870  Progress: 5867 on 7870  Progress: 5868 on 7870  Progress: 5869 on 7870  Progress: 5870 on 7870  Progress: 5871 on 7870  Progress: 5872 on 7870  Progress: 5873 on 7870  Progress: 5874 on 7870  Progress: 5875 on 7870  Progress: 5876 on 7870  Progress: 5877 on 7870  Progress: 5878 on 7870  Progress: 5879 on 7870  Progress: 5880 on 7870  Progress: 5881 on 7870  Progress: 5882 on 7870  Progress: 5883 on 7870  Progress: 5884 on 7870  Progress: 5885 on 7870  Progress: 5886 on 7870  Progress: 5887 on 7870  Progress: 5888 on 7870  Progress: 5889 on 7870  Progress: 5890 on 7870  Progress: 5891 on 7870  Progress: 5892 on 7870  Progress: 5893 on 7870  Progress: 5894 on 7870  Progress: 5895 on 7870  Progress: 5896 on 7870  Progress: 5897 on 7870  Progress: 5898 on 7870  Progress: 5899 on 7870  Progress: 5900 on 7870  Progress: 5901 on 7870  Progress: 5902 on 7870  Progress: 5903 on 7870  Progress: 5904 on 7870  Progress: 5905 on 7870  Progress: 5906 on 7870  Progress: 5907 on 7870  Progress: 5908 on 7870  Progress: 5909 on 7870  Progress: 5910 on 7870  Progress: 5911 on 7870  Progress: 5912 on 7870  Progress: 5913 on 7870  Progress: 5914 on 7870  Progress: 5915 on 7870  Progress: 5916 on 7870  Progress: 5917 on 7870  Progress: 5918 on 7870  Progress: 5919 on 7870  Progress: 5920 on 7870  Progress: 5921 on 7870  Progress: 5922 on 7870  Progress: 5923 on 7870  Progress: 5924 on 7870  Progress: 5925 on 7870  Progress: 5926 on 7870  Progress: 5927 on 7870  Progress: 5928 on 7870  Progress: 5929 on 7870  Progress: 5930 on 7870  Progress: 5931 on 7870  Progress: 5932 on 7870  Progress: 5933 on 7870  Progress: 5934 on 7870  Progress: 5935 on 7870  Progress: 5936 on 7870  Progress: 5937 on 7870  Progress: 5938 on 7870  Progress: 5939 on 7870  Progress: 5940 on 7870  Progress: 5941 on 7870  Progress: 5942 on 7870  Progress: 5943 on 7870  Progress: 5944 on 7870  Progress: 5945 on 7870  Progress: 5946 on 7870  Progress: 5947 on 7870  Progress: 5948 on 7870  Progress: 5949 on 7870  Progress: 5950 on 7870  Progress: 5951 on 7870  Progress: 5952 on 7870  Progress: 5953 on 7870  Progress: 5954 on 7870  Progress: 5955 on 7870  Progress: 5956 on 7870  Progress: 5957 on 7870  Progress: 5958 on 7870  Progress: 5959 on 7870  Progress: 5960 on 7870  Progress: 5961 on 7870  Progress: 5962 on 7870  Progress: 5963 on 7870  Progress: 5964 on 7870  Progress: 5965 on 7870  Progress: 5966 on 7870  Progress: 5967 on 7870  Progress: 5968 on 7870  Progress: 5969 on 7870  Progress: 5970 on 7870  Progress: 5971 on 7870  Progress: 5972 on 7870  Progress: 5973 on 7870  Progress: 5974 on 7870  Progress: 5975 on 7870  Progress: 5976 on 7870  Progress: 5977 on 7870  Progress: 5978 on 7870  Progress: 5979 on 7870  Progress: 5980 on 7870  Progress: 5981 on 7870  Progress: 5982 on 7870  Progress: 5983 on 7870  Progress: 5984 on 7870  Progress: 5985 on 7870  Progress: 5986 on 7870  Progress: 5987 on 7870  Progress: 5988 on 7870  Progress: 5989 on 7870  Progress: 5990 on 7870  Progress: 5991 on 7870  Progress: 5992 on 7870  Progress: 5993 on 7870  Progress: 5994 on 7870  Progress: 5995 on 7870  Progress: 5996 on 7870  Progress: 5997 on 7870  Progress: 5998 on 7870  Progress: 5999 on 7870  Progress: 6000 on 7870  Progress: 6001 on 7870  Progress: 6002 on 7870  Progress: 6003 on 7870  Progress: 6004 on 7870  Progress: 6005 on 7870  Progress: 6006 on 7870  Progress: 6007 on 7870  Progress: 6008 on 7870  Progress: 6009 on 7870  Progress: 6010 on 7870  Progress: 6011 on 7870  Progress: 6012 on 7870  Progress: 6013 on 7870  Progress: 6014 on 7870  Progress: 6015 on 7870  Progress: 6016 on 7870  Progress: 6017 on 7870  Progress: 6018 on 7870  Progress: 6019 on 7870  Progress: 6020 on 7870  Progress: 6021 on 7870  Progress: 6022 on 7870  Progress: 6023 on 7870  Progress: 6024 on 7870  Progress: 6025 on 7870  Progress: 6026 on 7870  Progress: 6027 on 7870  Progress: 6028 on 7870  Progress: 6029 on 7870  Progress: 6030 on 7870  Progress: 6031 on 7870  Progress: 6032 on 7870  Progress: 6033 on 7870  Progress: 6034 on 7870  Progress: 6035 on 7870  Progress: 6036 on 7870  Progress: 6037 on 7870  Progress: 6038 on 7870  Progress: 6039 on 7870  Progress: 6040 on 7870  Progress: 6041 on 7870  Progress: 6042 on 7870  Progress: 6043 on 7870  Progress: 6044 on 7870  Progress: 6045 on 7870  Progress: 6046 on 7870  Progress: 6047 on 7870  Progress: 6048 on 7870  Progress: 6049 on 7870  Progress: 6050 on 7870  Progress: 6051 on 7870  Progress: 6052 on 7870  Progress: 6053 on 7870  Progress: 6054 on 7870  Progress: 6055 on 7870  Progress: 6056 on 7870  Progress: 6057 on 7870  Progress: 6058 on 7870  Progress: 6059 on 7870  Progress: 6060 on 7870  Progress: 6061 on 7870  Progress: 6062 on 7870  Progress: 6063 on 7870  Progress: 6064 on 7870  Progress: 6065 on 7870  Progress: 6066 on 7870  Progress: 6067 on 7870  Progress: 6068 on 7870  Progress: 6069 on 7870  Progress: 6070 on 7870  Progress: 6071 on 7870  Progress: 6072 on 7870  Progress: 6073 on 7870  Progress: 6074 on 7870  Progress: 6075 on 7870  Progress: 6076 on 7870  Progress: 6077 on 7870  Progress: 6078 on 7870  Progress: 6079 on 7870  Progress: 6080 on 7870  Progress: 6081 on 7870  Progress: 6082 on 7870  Progress: 6083 on 7870  Progress: 6084 on 7870  Progress: 6085 on 7870  Progress: 6086 on 7870  Progress: 6087 on 7870  Progress: 6088 on 7870  Progress: 6089 on 7870  Progress: 6090 on 7870  Progress: 6091 on 7870  Progress: 6092 on 7870  Progress: 6093 on 7870  Progress: 6094 on 7870  Progress: 6095 on 7870  Progress: 6096 on 7870  Progress: 6097 on 7870  Progress: 6098 on 7870  Progress: 6099 on 7870  Progress: 6100 on 7870  Progress: 6101 on 7870  Progress: 6102 on 7870  Progress: 6103 on 7870  Progress: 6104 on 7870  Progress: 6105 on 7870  Progress: 6106 on 7870  Progress: 6107 on 7870  Progress: 6108 on 7870  Progress: 6109 on 7870  Progress: 6110 on 7870  Progress: 6111 on 7870  Progress: 6112 on 7870  Progress: 6113 on 7870  Progress: 6114 on 7870  Progress: 6115 on 7870  Progress: 6116 on 7870  Progress: 6117 on 7870  Progress: 6118 on 7870  Progress: 6119 on 7870  Progress: 6120 on 7870  Progress: 6121 on 7870  Progress: 6122 on 7870  Progress: 6123 on 7870  Progress: 6124 on 7870  Progress: 6125 on 7870  Progress: 6126 on 7870  Progress: 6127 on 7870  Progress: 6128 on 7870  Progress: 6129 on 7870  Progress: 6130 on 7870  Progress: 6131 on 7870  Progress: 6132 on 7870  Progress: 6133 on 7870  Progress: 6134 on 7870  Progress: 6135 on 7870  Progress: 6136 on 7870  Progress: 6137 on 7870  Progress: 6138 on 7870  Progress: 6139 on 7870  Progress: 6140 on 7870  Progress: 6141 on 7870  Progress: 6142 on 7870  Progress: 6143 on 7870  Progress: 6144 on 7870  Progress: 6145 on 7870  Progress: 6146 on 7870  Progress: 6147 on 7870  Progress: 6148 on 7870  Progress: 6149 on 7870  Progress: 6150 on 7870  Progress: 6151 on 7870  Progress: 6152 on 7870  Progress: 6153 on 7870  Progress: 6154 on 7870  Progress: 6155 on 7870  Progress: 6156 on 7870  Progress: 6157 on 7870  Progress: 6158 on 7870  Progress: 6159 on 7870  Progress: 6160 on 7870  Progress: 6161 on 7870  Progress: 6162 on 7870  Progress: 6163 on 7870  Progress: 6164 on 7870  Progress: 6165 on 7870  Progress: 6166 on 7870  Progress: 6167 on 7870  Progress: 6168 on 7870  Progress: 6169 on 7870  Progress: 6170 on 7870  Progress: 6171 on 7870  Progress: 6172 on 7870  Progress: 6173 on 7870  Progress: 6174 on 7870  Progress: 6175 on 7870  Progress: 6176 on 7870  Progress: 6177 on 7870  Progress: 6178 on 7870  Progress: 6179 on 7870  Progress: 6180 on 7870  Progress: 6181 on 7870  Progress: 6182 on 7870  Progress: 6183 on 7870  Progress: 6184 on 7870  Progress: 6185 on 7870  Progress: 6186 on 7870  Progress: 6187 on 7870  Progress: 6188 on 7870  Progress: 6189 on 7870  Progress: 6190 on 7870  Progress: 6191 on 7870  Progress: 6192 on 7870  Progress: 6193 on 7870  Progress: 6194 on 7870  Progress: 6195 on 7870  Progress: 6196 on 7870  Progress: 6197 on 7870  Progress: 6198 on 7870  Progress: 6199 on 7870  Progress: 6200 on 7870  Progress: 6201 on 7870  Progress: 6202 on 7870  Progress: 6203 on 7870  Progress: 6204 on 7870  Progress: 6205 on 7870  Progress: 6206 on 7870  Progress: 6207 on 7870  Progress: 6208 on 7870  Progress: 6209 on 7870  Progress: 6210 on 7870  Progress: 6211 on 7870  Progress: 6212 on 7870  Progress: 6213 on 7870  Progress: 6214 on 7870  Progress: 6215 on 7870  Progress: 6216 on 7870  Progress: 6217 on 7870  Progress: 6218 on 7870  Progress: 6219 on 7870  Progress: 6220 on 7870  Progress: 6221 on 7870  Progress: 6222 on 7870  Progress: 6223 on 7870  Progress: 6224 on 7870  Progress: 6225 on 7870  Progress: 6226 on 7870  Progress: 6227 on 7870  Progress: 6228 on 7870  Progress: 6229 on 7870  Progress: 6230 on 7870  Progress: 6231 on 7870  Progress: 6232 on 7870  Progress: 6233 on 7870  Progress: 6234 on 7870  Progress: 6235 on 7870  Progress: 6236 on 7870  Progress: 6237 on 7870  Progress: 6238 on 7870  Progress: 6239 on 7870  Progress: 6240 on 7870  Progress: 6241 on 7870  Progress: 6242 on 7870  Progress: 6243 on 7870  Progress: 6244 on 7870  Progress: 6245 on 7870  Progress: 6246 on 7870  Progress: 6247 on 7870  Progress: 6248 on 7870  Progress: 6249 on 7870  Progress: 6250 on 7870  Progress: 6251 on 7870  Progress: 6252 on 7870  Progress: 6253 on 7870  Progress: 6254 on 7870  Progress: 6255 on 7870  Progress: 6256 on 7870  Progress: 6257 on 7870  Progress: 6258 on 7870  Progress: 6259 on 7870  Progress: 6260 on 7870  Progress: 6261 on 7870  Progress: 6262 on 7870  Progress: 6263 on 7870  Progress: 6264 on 7870  Progress: 6265 on 7870  Progress: 6266 on 7870  Progress: 6267 on 7870  Progress: 6268 on 7870  Progress: 6269 on 7870  Progress: 6270 on 7870  Progress: 6271 on 7870  Progress: 6272 on 7870  Progress: 6273 on 7870  Progress: 6274 on 7870  Progress: 6275 on 7870  Progress: 6276 on 7870  Progress: 6277 on 7870  Progress: 6278 on 7870  Progress: 6279 on 7870  Progress: 6280 on 7870  Progress: 6281 on 7870  Progress: 6282 on 7870  Progress: 6283 on 7870  Progress: 6284 on 7870  Progress: 6285 on 7870  Progress: 6286 on 7870  Progress: 6287 on 7870  Progress: 6288 on 7870  Progress: 6289 on 7870  Progress: 6290 on 7870  Progress: 6291 on 7870  Progress: 6292 on 7870  Progress: 6293 on 7870  Progress: 6294 on 7870  Progress: 6295 on 7870  Progress: 6296 on 7870  Progress: 6297 on 7870  Progress: 6298 on 7870  Progress: 6299 on 7870  Progress: 6300 on 7870  Progress: 6301 on 7870  Progress: 6302 on 7870  Progress: 6303 on 7870  Progress: 6304 on 7870  Progress: 6305 on 7870  Progress: 6306 on 7870  Progress: 6307 on 7870  Progress: 6308 on 7870  Progress: 6309 on 7870  Progress: 6310 on 7870  Progress: 6311 on 7870  Progress: 6312 on 7870  Progress: 6313 on 7870  Progress: 6314 on 7870  Progress: 6315 on 7870  Progress: 6316 on 7870  Progress: 6317 on 7870  Progress: 6318 on 7870  Progress: 6319 on 7870  Progress: 6320 on 7870  Progress: 6321 on 7870  Progress: 6322 on 7870  Progress: 6323 on 7870  Progress: 6324 on 7870  Progress: 6325 on 7870  Progress: 6326 on 7870  Progress: 6327 on 7870  Progress: 6328 on 7870  Progress: 6329 on 7870  Progress: 6330 on 7870  Progress: 6331 on 7870  Progress: 6332 on 7870  Progress: 6333 on 7870  Progress: 6334 on 7870  Progress: 6335 on 7870  Progress: 6336 on 7870  Progress: 6337 on 7870  Progress: 6338 on 7870  Progress: 6339 on 7870  Progress: 6340 on 7870  Progress: 6341 on 7870  Progress: 6342 on 7870  Progress: 6343 on 7870  Progress: 6344 on 7870  Progress: 6345 on 7870  Progress: 6346 on 7870  Progress: 6347 on 7870  Progress: 6348 on 7870  Progress: 6349 on 7870  Progress: 6350 on 7870  Progress: 6351 on 7870  Progress: 6352 on 7870  Progress: 6353 on 7870  Progress: 6354 on 7870  Progress: 6355 on 7870  Progress: 6356 on 7870  Progress: 6357 on 7870  Progress: 6358 on 7870  Progress: 6359 on 7870  Progress: 6360 on 7870  Progress: 6361 on 7870  Progress: 6362 on 7870  Progress: 6363 on 7870  Progress: 6364 on 7870  Progress: 6365 on 7870  Progress: 6366 on 7870  Progress: 6367 on 7870  Progress: 6368 on 7870  Progress: 6369 on 7870  Progress: 6370 on 7870  Progress: 6371 on 7870  Progress: 6372 on 7870  Progress: 6373 on 7870  Progress: 6374 on 7870  Progress: 6375 on 7870  Progress: 6376 on 7870  Progress: 6377 on 7870  Progress: 6378 on 7870  Progress: 6379 on 7870  Progress: 6380 on 7870  Progress: 6381 on 7870  Progress: 6382 on 7870  Progress: 6383 on 7870  Progress: 6384 on 7870  Progress: 6385 on 7870  Progress: 6386 on 7870  Progress: 6387 on 7870  Progress: 6388 on 7870  Progress: 6389 on 7870  Progress: 6390 on 7870  Progress: 6391 on 7870  Progress: 6392 on 7870  Progress: 6393 on 7870  Progress: 6394 on 7870  Progress: 6395 on 7870  Progress: 6396 on 7870  Progress: 6397 on 7870  Progress: 6398 on 7870  Progress: 6399 on 7870  Progress: 6400 on 7870  Progress: 6401 on 7870  Progress: 6402 on 7870  Progress: 6403 on 7870  Progress: 6404 on 7870  Progress: 6405 on 7870  Progress: 6406 on 7870  Progress: 6407 on 7870  Progress: 6408 on 7870  Progress: 6409 on 7870  Progress: 6410 on 7870  Progress: 6411 on 7870  Progress: 6412 on 7870  Progress: 6413 on 7870  Progress: 6414 on 7870  Progress: 6415 on 7870  Progress: 6416 on 7870  Progress: 6417 on 7870  Progress: 6418 on 7870  Progress: 6419 on 7870  Progress: 6420 on 7870  Progress: 6421 on 7870  Progress: 6422 on 7870  Progress: 6423 on 7870  Progress: 6424 on 7870  Progress: 6425 on 7870  Progress: 6426 on 7870  Progress: 6427 on 7870  Progress: 6428 on 7870  Progress: 6429 on 7870  Progress: 6430 on 7870  Progress: 6431 on 7870  Progress: 6432 on 7870  Progress: 6433 on 7870  Progress: 6434 on 7870  Progress: 6435 on 7870  Progress: 6436 on 7870  Progress: 6437 on 7870  Progress: 6438 on 7870  Progress: 6439 on 7870  Progress: 6440 on 7870  Progress: 6441 on 7870  Progress: 6442 on 7870  Progress: 6443 on 7870  Progress: 6444 on 7870  Progress: 6445 on 7870  Progress: 6446 on 7870  Progress: 6447 on 7870  Progress: 6448 on 7870  Progress: 6449 on 7870  Progress: 6450 on 7870  Progress: 6451 on 7870  Progress: 6452 on 7870  Progress: 6453 on 7870  Progress: 6454 on 7870  Progress: 6455 on 7870  Progress: 6456 on 7870  Progress: 6457 on 7870  Progress: 6458 on 7870  Progress: 6459 on 7870  Progress: 6460 on 7870  Progress: 6461 on 7870  Progress: 6462 on 7870  Progress: 6463 on 7870  Progress: 6464 on 7870  Progress: 6465 on 7870  Progress: 6466 on 7870  Progress: 6467 on 7870  Progress: 6468 on 7870  Progress: 6469 on 7870  Progress: 6470 on 7870  Progress: 6471 on 7870  Progress: 6472 on 7870  Progress: 6473 on 7870  Progress: 6474 on 7870  Progress: 6475 on 7870  Progress: 6476 on 7870  Progress: 6477 on 7870  Progress: 6478 on 7870  Progress: 6479 on 7870  Progress: 6480 on 7870  Progress: 6481 on 7870  Progress: 6482 on 7870  Progress: 6483 on 7870  Progress: 6484 on 7870  Progress: 6485 on 7870  Progress: 6486 on 7870  Progress: 6487 on 7870  Progress: 6488 on 7870  Progress: 6489 on 7870  Progress: 6490 on 7870  Progress: 6491 on 7870  Progress: 6492 on 7870  Progress: 6493 on 7870  Progress: 6494 on 7870  Progress: 6495 on 7870  Progress: 6496 on 7870  Progress: 6497 on 7870  Progress: 6498 on 7870  Progress: 6499 on 7870  Progress: 6500 on 7870  Progress: 6501 on 7870  Progress: 6502 on 7870  Progress: 6503 on 7870  Progress: 6504 on 7870  Progress: 6505 on 7870  Progress: 6506 on 7870  Progress: 6507 on 7870  Progress: 6508 on 7870  Progress: 6509 on 7870  Progress: 6510 on 7870  Progress: 6511 on 7870  Progress: 6512 on 7870  Progress: 6513 on 7870  Progress: 6514 on 7870  Progress: 6515 on 7870  Progress: 6516 on 7870  Progress: 6517 on 7870  Progress: 6518 on 7870  Progress: 6519 on 7870  Progress: 6520 on 7870  Progress: 6521 on 7870  Progress: 6522 on 7870  Progress: 6523 on 7870  Progress: 6524 on 7870  Progress: 6525 on 7870  Progress: 6526 on 7870  Progress: 6527 on 7870  Progress: 6528 on 7870  Progress: 6529 on 7870  Progress: 6530 on 7870  Progress: 6531 on 7870  Progress: 6532 on 7870  Progress: 6533 on 7870  Progress: 6534 on 7870  Progress: 6535 on 7870  Progress: 6536 on 7870  Progress: 6537 on 7870  Progress: 6538 on 7870  Progress: 6539 on 7870  Progress: 6540 on 7870  Progress: 6541 on 7870  Progress: 6542 on 7870  Progress: 6543 on 7870  Progress: 6544 on 7870  Progress: 6545 on 7870  Progress: 6546 on 7870  Progress: 6547 on 7870  Progress: 6548 on 7870  Progress: 6549 on 7870  Progress: 6550 on 7870  Progress: 6551 on 7870  Progress: 6552 on 7870  Progress: 6553 on 7870  Progress: 6554 on 7870  Progress: 6555 on 7870  Progress: 6556 on 7870  Progress: 6557 on 7870  Progress: 6558 on 7870  Progress: 6559 on 7870  Progress: 6560 on 7870  Progress: 6561 on 7870  Progress: 6562 on 7870  Progress: 6563 on 7870  Progress: 6564 on 7870  Progress: 6565 on 7870  Progress: 6566 on 7870  Progress: 6567 on 7870  Progress: 6568 on 7870  Progress: 6569 on 7870  Progress: 6570 on 7870  Progress: 6571 on 7870  Progress: 6572 on 7870  Progress: 6573 on 7870  Progress: 6574 on 7870  Progress: 6575 on 7870  Progress: 6576 on 7870  Progress: 6577 on 7870  Progress: 6578 on 7870  Progress: 6579 on 7870  Progress: 6580 on 7870  Progress: 6581 on 7870  Progress: 6582 on 7870  Progress: 6583 on 7870  Progress: 6584 on 7870  Progress: 6585 on 7870  Progress: 6586 on 7870  Progress: 6587 on 7870  Progress: 6588 on 7870  Progress: 6589 on 7870  Progress: 6590 on 7870  Progress: 6591 on 7870  Progress: 6592 on 7870  Progress: 6593 on 7870  Progress: 6594 on 7870  Progress: 6595 on 7870  Progress: 6596 on 7870  Progress: 6597 on 7870  Progress: 6598 on 7870  Progress: 6599 on 7870  Progress: 6600 on 7870  Progress: 6601 on 7870  Progress: 6602 on 7870  Progress: 6603 on 7870  Progress: 6604 on 7870  Progress: 6605 on 7870  Progress: 6606 on 7870  Progress: 6607 on 7870  Progress: 6608 on 7870  Progress: 6609 on 7870  Progress: 6610 on 7870  Progress: 6611 on 7870  Progress: 6612 on 7870  Progress: 6613 on 7870  Progress: 6614 on 7870  Progress: 6615 on 7870  Progress: 6616 on 7870  Progress: 6617 on 7870  Progress: 6618 on 7870  Progress: 6619 on 7870  Progress: 6620 on 7870  Progress: 6621 on 7870  Progress: 6622 on 7870  Progress: 6623 on 7870  Progress: 6624 on 7870  Progress: 6625 on 7870  Progress: 6626 on 7870  Progress: 6627 on 7870  Progress: 6628 on 7870  Progress: 6629 on 7870  Progress: 6630 on 7870  Progress: 6631 on 7870  Progress: 6632 on 7870  Progress: 6633 on 7870  Progress: 6634 on 7870  Progress: 6635 on 7870  Progress: 6636 on 7870  Progress: 6637 on 7870  Progress: 6638 on 7870  Progress: 6639 on 7870  Progress: 6640 on 7870  Progress: 6641 on 7870  Progress: 6642 on 7870  Progress: 6643 on 7870  Progress: 6644 on 7870  Progress: 6645 on 7870  Progress: 6646 on 7870  Progress: 6647 on 7870  Progress: 6648 on 7870  Progress: 6649 on 7870  Progress: 6650 on 7870  Progress: 6651 on 7870  Progress: 6652 on 7870  Progress: 6653 on 7870  Progress: 6654 on 7870  Progress: 6655 on 7870  Progress: 6656 on 7870  Progress: 6657 on 7870  Progress: 6658 on 7870  Progress: 6659 on 7870  Progress: 6660 on 7870  Progress: 6661 on 7870  Progress: 6662 on 7870  Progress: 6663 on 7870  Progress: 6664 on 7870  Progress: 6665 on 7870  Progress: 6666 on 7870  Progress: 6667 on 7870  Progress: 6668 on 7870  Progress: 6669 on 7870  Progress: 6670 on 7870  Progress: 6671 on 7870  Progress: 6672 on 7870  Progress: 6673 on 7870  Progress: 6674 on 7870  Progress: 6675 on 7870  Progress: 6676 on 7870  Progress: 6677 on 7870  Progress: 6678 on 7870  Progress: 6679 on 7870  Progress: 6680 on 7870  Progress: 6681 on 7870  Progress: 6682 on 7870  Progress: 6683 on 7870  Progress: 6684 on 7870  Progress: 6685 on 7870  Progress: 6686 on 7870  Progress: 6687 on 7870  Progress: 6688 on 7870  Progress: 6689 on 7870  Progress: 6690 on 7870  Progress: 6691 on 7870  Progress: 6692 on 7870  Progress: 6693 on 7870  Progress: 6694 on 7870  Progress: 6695 on 7870  Progress: 6696 on 7870  Progress: 6697 on 7870  Progress: 6698 on 7870  Progress: 6699 on 7870  Progress: 6700 on 7870  Progress: 6701 on 7870  Progress: 6702 on 7870  Progress: 6703 on 7870  Progress: 6704 on 7870  Progress: 6705 on 7870  Progress: 6706 on 7870  Progress: 6707 on 7870  Progress: 6708 on 7870  Progress: 6709 on 7870  Progress: 6710 on 7870  Progress: 6711 on 7870  Progress: 6712 on 7870  Progress: 6713 on 7870  Progress: 6714 on 7870  Progress: 6715 on 7870  Progress: 6716 on 7870  Progress: 6717 on 7870  Progress: 6718 on 7870  Progress: 6719 on 7870  Progress: 6720 on 7870  Progress: 6721 on 7870  Progress: 6722 on 7870  Progress: 6723 on 7870  Progress: 6724 on 7870  Progress: 6725 on 7870  Progress: 6726 on 7870  Progress: 6727 on 7870  Progress: 6728 on 7870  Progress: 6729 on 7870  Progress: 6730 on 7870  Progress: 6731 on 7870  Progress: 6732 on 7870  Progress: 6733 on 7870  Progress: 6734 on 7870  Progress: 6735 on 7870  Progress: 6736 on 7870  Progress: 6737 on 7870  Progress: 6738 on 7870  Progress: 6739 on 7870  Progress: 6740 on 7870  Progress: 6741 on 7870  Progress: 6742 on 7870  Progress: 6743 on 7870  Progress: 6744 on 7870  Progress: 6745 on 7870  Progress: 6746 on 7870  Progress: 6747 on 7870  Progress: 6748 on 7870  Progress: 6749 on 7870  Progress: 6750 on 7870  Progress: 6751 on 7870  Progress: 6752 on 7870  Progress: 6753 on 7870  Progress: 6754 on 7870  Progress: 6755 on 7870  Progress: 6756 on 7870  Progress: 6757 on 7870  Progress: 6758 on 7870  Progress: 6759 on 7870  Progress: 6760 on 7870  Progress: 6761 on 7870  Progress: 6762 on 7870  Progress: 6763 on 7870  Progress: 6764 on 7870  Progress: 6765 on 7870  Progress: 6766 on 7870  Progress: 6767 on 7870  Progress: 6768 on 7870  Progress: 6769 on 7870  Progress: 6770 on 7870  Progress: 6771 on 7870  Progress: 6772 on 7870  Progress: 6773 on 7870  Progress: 6774 on 7870  Progress: 6775 on 7870  Progress: 6776 on 7870  Progress: 6777 on 7870  Progress: 6778 on 7870  Progress: 6779 on 7870  Progress: 6780 on 7870  Progress: 6781 on 7870  Progress: 6782 on 7870  Progress: 6783 on 7870  Progress: 6784 on 7870  Progress: 6785 on 7870  Progress: 6786 on 7870  Progress: 6787 on 7870  Progress: 6788 on 7870  Progress: 6789 on 7870  Progress: 6790 on 7870  Progress: 6791 on 7870  Progress: 6792 on 7870  Progress: 6793 on 7870  Progress: 6794 on 7870  Progress: 6795 on 7870  Progress: 6796 on 7870  Progress: 6797 on 7870  Progress: 6798 on 7870  Progress: 6799 on 7870  Progress: 6800 on 7870  Progress: 6801 on 7870  Progress: 6802 on 7870  Progress: 6803 on 7870  Progress: 6804 on 7870  Progress: 6805 on 7870  Progress: 6806 on 7870  Progress: 6807 on 7870  Progress: 6808 on 7870  Progress: 6809 on 7870  Progress: 6810 on 7870  Progress: 6811 on 7870  Progress: 6812 on 7870  Progress: 6813 on 7870  Progress: 6814 on 7870  Progress: 6815 on 7870  Progress: 6816 on 7870  Progress: 6817 on 7870  Progress: 6818 on 7870  Progress: 6819 on 7870  Progress: 6820 on 7870  Progress: 6821 on 7870  Progress: 6822 on 7870  Progress: 6823 on 7870  Progress: 6824 on 7870  Progress: 6825 on 7870  Progress: 6826 on 7870  Progress: 6827 on 7870  Progress: 6828 on 7870  Progress: 6829 on 7870  Progress: 6830 on 7870  Progress: 6831 on 7870  Progress: 6832 on 7870  Progress: 6833 on 7870  Progress: 6834 on 7870  Progress: 6835 on 7870  Progress: 6836 on 7870  Progress: 6837 on 7870  Progress: 6838 on 7870  Progress: 6839 on 7870  Progress: 6840 on 7870  Progress: 6841 on 7870  Progress: 6842 on 7870  Progress: 6843 on 7870  Progress: 6844 on 7870  Progress: 6845 on 7870  Progress: 6846 on 7870  Progress: 6847 on 7870  Progress: 6848 on 7870  Progress: 6849 on 7870  Progress: 6850 on 7870  Progress: 6851 on 7870  Progress: 6852 on 7870  Progress: 6853 on 7870  Progress: 6854 on 7870  Progress: 6855 on 7870  Progress: 6856 on 7870  Progress: 6857 on 7870  Progress: 6858 on 7870  Progress: 6859 on 7870  Progress: 6860 on 7870  Progress: 6861 on 7870  Progress: 6862 on 7870  Progress: 6863 on 7870  Progress: 6864 on 7870  Progress: 6865 on 7870  Progress: 6866 on 7870  Progress: 6867 on 7870  Progress: 6868 on 7870  Progress: 6869 on 7870  Progress: 6870 on 7870  Progress: 6871 on 7870  Progress: 6872 on 7870  Progress: 6873 on 7870  Progress: 6874 on 7870  Progress: 6875 on 7870  Progress: 6876 on 7870  Progress: 6877 on 7870  Progress: 6878 on 7870  Progress: 6879 on 7870  Progress: 6880 on 7870  Progress: 6881 on 7870  Progress: 6882 on 7870  Progress: 6883 on 7870  Progress: 6884 on 7870  Progress: 6885 on 7870  Progress: 6886 on 7870  Progress: 6887 on 7870  Progress: 6888 on 7870  Progress: 6889 on 7870  Progress: 6890 on 7870  Progress: 6891 on 7870  Progress: 6892 on 7870  Progress: 6893 on 7870  Progress: 6894 on 7870  Progress: 6895 on 7870  Progress: 6896 on 7870  Progress: 6897 on 7870  Progress: 6898 on 7870  Progress: 6899 on 7870  Progress: 6900 on 7870  Progress: 6901 on 7870  Progress: 6902 on 7870  Progress: 6903 on 7870  Progress: 6904 on 7870  Progress: 6905 on 7870  Progress: 6906 on 7870  Progress: 6907 on 7870  Progress: 6908 on 7870  Progress: 6909 on 7870  Progress: 6910 on 7870  Progress: 6911 on 7870  Progress: 6912 on 7870  Progress: 6913 on 7870  Progress: 6914 on 7870  Progress: 6915 on 7870  Progress: 6916 on 7870  Progress: 6917 on 7870  Progress: 6918 on 7870  Progress: 6919 on 7870  Progress: 6920 on 7870  Progress: 6921 on 7870  Progress: 6922 on 7870  Progress: 6923 on 7870  Progress: 6924 on 7870  Progress: 6925 on 7870  Progress: 6926 on 7870  Progress: 6927 on 7870  Progress: 6928 on 7870  Progress: 6929 on 7870  Progress: 6930 on 7870  Progress: 6931 on 7870  Progress: 6932 on 7870  Progress: 6933 on 7870  Progress: 6934 on 7870  Progress: 6935 on 7870  Progress: 6936 on 7870  Progress: 6937 on 7870  Progress: 6938 on 7870  Progress: 6939 on 7870  Progress: 6940 on 7870  Progress: 6941 on 7870  Progress: 6942 on 7870  Progress: 6943 on 7870  Progress: 6944 on 7870  Progress: 6945 on 7870  Progress: 6946 on 7870  Progress: 6947 on 7870  Progress: 6948 on 7870  Progress: 6949 on 7870  Progress: 6950 on 7870  Progress: 6951 on 7870  Progress: 6952 on 7870  Progress: 6953 on 7870  Progress: 6954 on 7870  Progress: 6955 on 7870  Progress: 6956 on 7870  Progress: 6957 on 7870  Progress: 6958 on 7870  Progress: 6959 on 7870  Progress: 6960 on 7870  Progress: 6961 on 7870  Progress: 6962 on 7870  Progress: 6963 on 7870  Progress: 6964 on 7870  Progress: 6965 on 7870  Progress: 6966 on 7870  Progress: 6967 on 7870  Progress: 6968 on 7870  Progress: 6969 on 7870  Progress: 6970 on 7870  Progress: 6971 on 7870  Progress: 6972 on 7870  Progress: 6973 on 7870  Progress: 6974 on 7870  Progress: 6975 on 7870  Progress: 6976 on 7870  Progress: 6977 on 7870  Progress: 6978 on 7870  Progress: 6979 on 7870  Progress: 6980 on 7870  Progress: 6981 on 7870  Progress: 6982 on 7870  Progress: 6983 on 7870  Progress: 6984 on 7870  Progress: 6985 on 7870  Progress: 6986 on 7870  Progress: 6987 on 7870  Progress: 6988 on 7870  Progress: 6989 on 7870  Progress: 6990 on 7870  Progress: 6991 on 7870  Progress: 6992 on 7870  Progress: 6993 on 7870  Progress: 6994 on 7870  Progress: 6995 on 7870  Progress: 6996 on 7870  Progress: 6997 on 7870  Progress: 6998 on 7870  Progress: 6999 on 7870  Progress: 7000 on 7870  Progress: 7001 on 7870  Progress: 7002 on 7870  Progress: 7003 on 7870  Progress: 7004 on 7870  Progress: 7005 on 7870  Progress: 7006 on 7870  Progress: 7007 on 7870  Progress: 7008 on 7870  Progress: 7009 on 7870  Progress: 7010 on 7870  Progress: 7011 on 7870  Progress: 7012 on 7870  Progress: 7013 on 7870  Progress: 7014 on 7870  Progress: 7015 on 7870  Progress: 7016 on 7870  Progress: 7017 on 7870  Progress: 7018 on 7870  Progress: 7019 on 7870  Progress: 7020 on 7870  Progress: 7021 on 7870  Progress: 7022 on 7870  Progress: 7023 on 7870  Progress: 7024 on 7870  Progress: 7025 on 7870  Progress: 7026 on 7870  Progress: 7027 on 7870  Progress: 7028 on 7870  Progress: 7029 on 7870  Progress: 7030 on 7870  Progress: 7031 on 7870  Progress: 7032 on 7870  Progress: 7033 on 7870  Progress: 7034 on 7870  Progress: 7035 on 7870  Progress: 7036 on 7870  Progress: 7037 on 7870  Progress: 7038 on 7870  Progress: 7039 on 7870  Progress: 7040 on 7870  Progress: 7041 on 7870  Progress: 7042 on 7870  Progress: 7043 on 7870  Progress: 7044 on 7870  Progress: 7045 on 7870  Progress: 7046 on 7870  Progress: 7047 on 7870  Progress: 7048 on 7870  Progress: 7049 on 7870  Progress: 7050 on 7870  Progress: 7051 on 7870  Progress: 7052 on 7870  Progress: 7053 on 7870  Progress: 7054 on 7870  Progress: 7055 on 7870  Progress: 7056 on 7870  Progress: 7057 on 7870  Progress: 7058 on 7870  Progress: 7059 on 7870  Progress: 7060 on 7870  Progress: 7061 on 7870  Progress: 7062 on 7870  Progress: 7063 on 7870  Progress: 7064 on 7870  Progress: 7065 on 7870  Progress: 7066 on 7870  Progress: 7067 on 7870  Progress: 7068 on 7870  Progress: 7069 on 7870  Progress: 7070 on 7870  Progress: 7071 on 7870  Progress: 7072 on 7870  Progress: 7073 on 7870  Progress: 7074 on 7870  Progress: 7075 on 7870  Progress: 7076 on 7870  Progress: 7077 on 7870  Progress: 7078 on 7870  Progress: 7079 on 7870  Progress: 7080 on 7870  Progress: 7081 on 7870  Progress: 7082 on 7870  Progress: 7083 on 7870  Progress: 7084 on 7870  Progress: 7085 on 7870  Progress: 7086 on 7870  Progress: 7087 on 7870  Progress: 7088 on 7870  Progress: 7089 on 7870  Progress: 7090 on 7870  Progress: 7091 on 7870  Progress: 7092 on 7870  Progress: 7093 on 7870  Progress: 7094 on 7870  Progress: 7095 on 7870  Progress: 7096 on 7870  Progress: 7097 on 7870  Progress: 7098 on 7870  Progress: 7099 on 7870  Progress: 7100 on 7870  Progress: 7101 on 7870  Progress: 7102 on 7870  Progress: 7103 on 7870  Progress: 7104 on 7870  Progress: 7105 on 7870  Progress: 7106 on 7870  Progress: 7107 on 7870  Progress: 7108 on 7870  Progress: 7109 on 7870  Progress: 7110 on 7870  Progress: 7111 on 7870  Progress: 7112 on 7870  Progress: 7113 on 7870  Progress: 7114 on 7870  Progress: 7115 on 7870  Progress: 7116 on 7870  Progress: 7117 on 7870  Progress: 7118 on 7870  Progress: 7119 on 7870  Progress: 7120 on 7870  Progress: 7121 on 7870  Progress: 7122 on 7870  Progress: 7123 on 7870  Progress: 7124 on 7870  Progress: 7125 on 7870  Progress: 7126 on 7870  Progress: 7127 on 7870  Progress: 7128 on 7870  Progress: 7129 on 7870  Progress: 7130 on 7870  Progress: 7131 on 7870  Progress: 7132 on 7870  Progress: 7133 on 7870  Progress: 7134 on 7870  Progress: 7135 on 7870  Progress: 7136 on 7870  Progress: 7137 on 7870  Progress: 7138 on 7870  Progress: 7139 on 7870  Progress: 7140 on 7870  Progress: 7141 on 7870  Progress: 7142 on 7870  Progress: 7143 on 7870  Progress: 7144 on 7870  Progress: 7145 on 7870  Progress: 7146 on 7870  Progress: 7147 on 7870  Progress: 7148 on 7870  Progress: 7149 on 7870  Progress: 7150 on 7870  Progress: 7151 on 7870  Progress: 7152 on 7870  Progress: 7153 on 7870  Progress: 7154 on 7870  Progress: 7155 on 7870  Progress: 7156 on 7870  Progress: 7157 on 7870  Progress: 7158 on 7870  Progress: 7159 on 7870  Progress: 7160 on 7870  Progress: 7161 on 7870  Progress: 7162 on 7870  Progress: 7163 on 7870  Progress: 7164 on 7870  Progress: 7165 on 7870  Progress: 7166 on 7870  Progress: 7167 on 7870  Progress: 7168 on 7870  Progress: 7169 on 7870  Progress: 7170 on 7870  Progress: 7171 on 7870  Progress: 7172 on 7870  Progress: 7173 on 7870  Progress: 7174 on 7870  Progress: 7175 on 7870  Progress: 7176 on 7870  Progress: 7177 on 7870  Progress: 7178 on 7870  Progress: 7179 on 7870  Progress: 7180 on 7870  Progress: 7181 on 7870  Progress: 7182 on 7870  Progress: 7183 on 7870  Progress: 7184 on 7870  Progress: 7185 on 7870  Progress: 7186 on 7870  Progress: 7187 on 7870  Progress: 7188 on 7870  Progress: 7189 on 7870  Progress: 7190 on 7870  Progress: 7191 on 7870  Progress: 7192 on 7870  Progress: 7193 on 7870  Progress: 7194 on 7870  Progress: 7195 on 7870  Progress: 7196 on 7870  Progress: 7197 on 7870  Progress: 7198 on 7870  Progress: 7199 on 7870  Progress: 7200 on 7870  Progress: 7201 on 7870  Progress: 7202 on 7870  Progress: 7203 on 7870  Progress: 7204 on 7870  Progress: 7205 on 7870  Progress: 7206 on 7870  Progress: 7207 on 7870  Progress: 7208 on 7870  Progress: 7209 on 7870  Progress: 7210 on 7870  Progress: 7211 on 7870  Progress: 7212 on 7870  Progress: 7213 on 7870  Progress: 7214 on 7870  Progress: 7215 on 7870  Progress: 7216 on 7870  Progress: 7217 on 7870  Progress: 7218 on 7870  Progress: 7219 on 7870  Progress: 7220 on 7870  Progress: 7221 on 7870  Progress: 7222 on 7870  Progress: 7223 on 7870  Progress: 7224 on 7870  Progress: 7225 on 7870  Progress: 7226 on 7870  Progress: 7227 on 7870  Progress: 7228 on 7870  Progress: 7229 on 7870  Progress: 7230 on 7870  Progress: 7231 on 7870  Progress: 7232 on 7870  Progress: 7233 on 7870  Progress: 7234 on 7870  Progress: 7235 on 7870  Progress: 7236 on 7870  Progress: 7237 on 7870  Progress: 7238 on 7870  Progress: 7239 on 7870  Progress: 7240 on 7870  Progress: 7241 on 7870  Progress: 7242 on 7870  Progress: 7243 on 7870  Progress: 7244 on 7870  Progress: 7245 on 7870  Progress: 7246 on 7870  Progress: 7247 on 7870  Progress: 7248 on 7870  Progress: 7249 on 7870  Progress: 7250 on 7870  Progress: 7251 on 7870  Progress: 7252 on 7870  Progress: 7253 on 7870  Progress: 7254 on 7870  Progress: 7255 on 7870  Progress: 7256 on 7870  Progress: 7257 on 7870  Progress: 7258 on 7870  Progress: 7259 on 7870  Progress: 7260 on 7870  Progress: 7261 on 7870  Progress: 7262 on 7870  Progress: 7263 on 7870  Progress: 7264 on 7870  Progress: 7265 on 7870  Progress: 7266 on 7870  Progress: 7267 on 7870  Progress: 7268 on 7870  Progress: 7269 on 7870  Progress: 7270 on 7870  Progress: 7271 on 7870  Progress: 7272 on 7870  Progress: 7273 on 7870  Progress: 7274 on 7870  Progress: 7275 on 7870  Progress: 7276 on 7870  Progress: 7277 on 7870  Progress: 7278 on 7870  Progress: 7279 on 7870  Progress: 7280 on 7870  Progress: 7281 on 7870  Progress: 7282 on 7870  Progress: 7283 on 7870  Progress: 7284 on 7870  Progress: 7285 on 7870  Progress: 7286 on 7870  Progress: 7287 on 7870  Progress: 7288 on 7870  Progress: 7289 on 7870  Progress: 7290 on 7870  Progress: 7291 on 7870  Progress: 7292 on 7870  Progress: 7293 on 7870  Progress: 7294 on 7870  Progress: 7295 on 7870  Progress: 7296 on 7870  Progress: 7297 on 7870  Progress: 7298 on 7870  Progress: 7299 on 7870  Progress: 7300 on 7870  Progress: 7301 on 7870  Progress: 7302 on 7870  Progress: 7303 on 7870  Progress: 7304 on 7870  Progress: 7305 on 7870  Progress: 7306 on 7870  Progress: 7307 on 7870  Progress: 7308 on 7870  Progress: 7309 on 7870  Progress: 7310 on 7870  Progress: 7311 on 7870  Progress: 7312 on 7870  Progress: 7313 on 7870  Progress: 7314 on 7870  Progress: 7315 on 7870  Progress: 7316 on 7870  Progress: 7317 on 7870  Progress: 7318 on 7870  Progress: 7319 on 7870  Progress: 7320 on 7870  Progress: 7321 on 7870  Progress: 7322 on 7870  Progress: 7323 on 7870  Progress: 7324 on 7870  Progress: 7325 on 7870  Progress: 7326 on 7870  Progress: 7327 on 7870  Progress: 7328 on 7870  Progress: 7329 on 7870  Progress: 7330 on 7870  Progress: 7331 on 7870  Progress: 7332 on 7870  Progress: 7333 on 7870  Progress: 7334 on 7870  Progress: 7335 on 7870  Progress: 7336 on 7870  Progress: 7337 on 7870  Progress: 7338 on 7870  Progress: 7339 on 7870  Progress: 7340 on 7870  Progress: 7341 on 7870  Progress: 7342 on 7870  Progress: 7343 on 7870  Progress: 7344 on 7870  Progress: 7345 on 7870  Progress: 7346 on 7870  Progress: 7347 on 7870  Progress: 7348 on 7870  Progress: 7349 on 7870  Progress: 7350 on 7870  Progress: 7351 on 7870  Progress: 7352 on 7870  Progress: 7353 on 7870  Progress: 7354 on 7870  Progress: 7355 on 7870  Progress: 7356 on 7870  Progress: 7357 on 7870  Progress: 7358 on 7870  Progress: 7359 on 7870  Progress: 7360 on 7870  Progress: 7361 on 7870  Progress: 7362 on 7870  Progress: 7363 on 7870  Progress: 7364 on 7870  Progress: 7365 on 7870  Progress: 7366 on 7870  Progress: 7367 on 7870  Progress: 7368 on 7870  Progress: 7369 on 7870  Progress: 7370 on 7870  Progress: 7371 on 7870  Progress: 7372 on 7870  Progress: 7373 on 7870  Progress: 7374 on 7870  Progress: 7375 on 7870  Progress: 7376 on 7870  Progress: 7377 on 7870  Progress: 7378 on 7870  Progress: 7379 on 7870  Progress: 7380 on 7870  Progress: 7381 on 7870  Progress: 7382 on 7870  Progress: 7383 on 7870  Progress: 7384 on 7870  Progress: 7385 on 7870  Progress: 7386 on 7870  Progress: 7387 on 7870  Progress: 7388 on 7870  Progress: 7389 on 7870  Progress: 7390 on 7870  Progress: 7391 on 7870  Progress: 7392 on 7870  Progress: 7393 on 7870  Progress: 7394 on 7870  Progress: 7395 on 7870  Progress: 7396 on 7870  Progress: 7397 on 7870  Progress: 7398 on 7870  Progress: 7399 on 7870  Progress: 7400 on 7870  Progress: 7401 on 7870  Progress: 7402 on 7870  Progress: 7403 on 7870  Progress: 7404 on 7870  Progress: 7405 on 7870  Progress: 7406 on 7870  Progress: 7407 on 7870  Progress: 7408 on 7870  Progress: 7409 on 7870  Progress: 7410 on 7870  Progress: 7411 on 7870  Progress: 7412 on 7870  Progress: 7413 on 7870  Progress: 7414 on 7870  Progress: 7415 on 7870  Progress: 7416 on 7870  Progress: 7417 on 7870  Progress: 7418 on 7870  Progress: 7419 on 7870  Progress: 7420 on 7870  Progress: 7421 on 7870  Progress: 7422 on 7870  Progress: 7423 on 7870  Progress: 7424 on 7870  Progress: 7425 on 7870  Progress: 7426 on 7870  Progress: 7427 on 7870  Progress: 7428 on 7870  Progress: 7429 on 7870  Progress: 7430 on 7870  Progress: 7431 on 7870  Progress: 7432 on 7870  Progress: 7433 on 7870  Progress: 7434 on 7870  Progress: 7435 on 7870  Progress: 7436 on 7870  Progress: 7437 on 7870  Progress: 7438 on 7870  Progress: 7439 on 7870  Progress: 7440 on 7870  Progress: 7441 on 7870  Progress: 7442 on 7870  Progress: 7443 on 7870  Progress: 7444 on 7870  Progress: 7445 on 7870  Progress: 7446 on 7870  Progress: 7447 on 7870  Progress: 7448 on 7870  Progress: 7449 on 7870  Progress: 7450 on 7870  Progress: 7451 on 7870  Progress: 7452 on 7870  Progress: 7453 on 7870  Progress: 7454 on 7870  Progress: 7455 on 7870  Progress: 7456 on 7870  Progress: 7457 on 7870  Progress: 7458 on 7870  Progress: 7459 on 7870  Progress: 7460 on 7870  Progress: 7461 on 7870  Progress: 7462 on 7870  Progress: 7463 on 7870  Progress: 7464 on 7870  Progress: 7465 on 7870  Progress: 7466 on 7870  Progress: 7467 on 7870  Progress: 7468 on 7870  Progress: 7469 on 7870  Progress: 7470 on 7870  Progress: 7471 on 7870  Progress: 7472 on 7870  Progress: 7473 on 7870  Progress: 7474 on 7870  Progress: 7475 on 7870  Progress: 7476 on 7870  Progress: 7477 on 7870  Progress: 7478 on 7870  Progress: 7479 on 7870  Progress: 7480 on 7870  Progress: 7481 on 7870  Progress: 7482 on 7870  Progress: 7483 on 7870  Progress: 7484 on 7870  Progress: 7485 on 7870  Progress: 7486 on 7870  Progress: 7487 on 7870  Progress: 7488 on 7870  Progress: 7489 on 7870  Progress: 7490 on 7870  Progress: 7491 on 7870  Progress: 7492 on 7870  Progress: 7493 on 7870  Progress: 7494 on 7870  Progress: 7495 on 7870  Progress: 7496 on 7870  Progress: 7497 on 7870  Progress: 7498 on 7870  Progress: 7499 on 7870  Progress: 7500 on 7870  Progress: 7501 on 7870  Progress: 7502 on 7870  Progress: 7503 on 7870  Progress: 7504 on 7870  Progress: 7505 on 7870  Progress: 7506 on 7870  Progress: 7507 on 7870  Progress: 7508 on 7870  Progress: 7509 on 7870  Progress: 7510 on 7870  Progress: 7511 on 7870  Progress: 7512 on 7870  Progress: 7513 on 7870  Progress: 7514 on 7870  Progress: 7515 on 7870  Progress: 7516 on 7870  Progress: 7517 on 7870  Progress: 7518 on 7870  Progress: 7519 on 7870  Progress: 7520 on 7870  Progress: 7521 on 7870  Progress: 7522 on 7870  Progress: 7523 on 7870  Progress: 7524 on 7870  Progress: 7525 on 7870  Progress: 7526 on 7870  Progress: 7527 on 7870  Progress: 7528 on 7870  Progress: 7529 on 7870  Progress: 7530 on 7870  Progress: 7531 on 7870  Progress: 7532 on 7870  Progress: 7533 on 7870  Progress: 7534 on 7870  Progress: 7535 on 7870  Progress: 7536 on 7870  Progress: 7537 on 7870  Progress: 7538 on 7870  Progress: 7539 on 7870  Progress: 7540 on 7870  Progress: 7541 on 7870  Progress: 7542 on 7870  Progress: 7543 on 7870  Progress: 7544 on 7870  Progress: 7545 on 7870  Progress: 7546 on 7870  Progress: 7547 on 7870  Progress: 7548 on 7870  Progress: 7549 on 7870  Progress: 7550 on 7870  Progress: 7551 on 7870  Progress: 7552 on 7870  Progress: 7553 on 7870  Progress: 7554 on 7870  Progress: 7555 on 7870  Progress: 7556 on 7870  Progress: 7557 on 7870  Progress: 7558 on 7870  Progress: 7559 on 7870  Progress: 7560 on 7870  Progress: 7561 on 7870  Progress: 7562 on 7870  Progress: 7563 on 7870  Progress: 7564 on 7870  Progress: 7565 on 7870  Progress: 7566 on 7870  Progress: 7567 on 7870  Progress: 7568 on 7870  Progress: 7569 on 7870  Progress: 7570 on 7870  Progress: 7571 on 7870  Progress: 7572 on 7870  Progress: 7573 on 7870  Progress: 7574 on 7870  Progress: 7575 on 7870  Progress: 7576 on 7870  Progress: 7577 on 7870  Progress: 7578 on 7870  Progress: 7579 on 7870  Progress: 7580 on 7870  Progress: 7581 on 7870  Progress: 7582 on 7870  Progress: 7583 on 7870  Progress: 7584 on 7870  Progress: 7585 on 7870  Progress: 7586 on 7870  Progress: 7587 on 7870  Progress: 7588 on 7870  Progress: 7589 on 7870  Progress: 7590 on 7870  Progress: 7591 on 7870  Progress: 7592 on 7870  Progress: 7593 on 7870  Progress: 7594 on 7870  Progress: 7595 on 7870  Progress: 7596 on 7870  Progress: 7597 on 7870  Progress: 7598 on 7870  Progress: 7599 on 7870  Progress: 7600 on 7870  Progress: 7601 on 7870  Progress: 7602 on 7870  Progress: 7603 on 7870  Progress: 7604 on 7870  Progress: 7605 on 7870  Progress: 7606 on 7870  Progress: 7607 on 7870  Progress: 7608 on 7870  Progress: 7609 on 7870  Progress: 7610 on 7870  Progress: 7611 on 7870  Progress: 7612 on 7870  Progress: 7613 on 7870  Progress: 7614 on 7870  Progress: 7615 on 7870  Progress: 7616 on 7870  Progress: 7617 on 7870  Progress: 7618 on 7870  Progress: 7619 on 7870  Progress: 7620 on 7870  Progress: 7621 on 7870  Progress: 7622 on 7870  Progress: 7623 on 7870  Progress: 7624 on 7870  Progress: 7625 on 7870  Progress: 7626 on 7870  Progress: 7627 on 7870  Progress: 7628 on 7870  Progress: 7629 on 7870  Progress: 7630 on 7870  Progress: 7631 on 7870  Progress: 7632 on 7870  Progress: 7633 on 7870  Progress: 7634 on 7870  Progress: 7635 on 7870  Progress: 7636 on 7870  Progress: 7637 on 7870  Progress: 7638 on 7870  Progress: 7639 on 7870  Progress: 7640 on 7870  Progress: 7641 on 7870  Progress: 7642 on 7870  Progress: 7643 on 7870  Progress: 7644 on 7870  Progress: 7645 on 7870  Progress: 7646 on 7870  Progress: 7647 on 7870  Progress: 7648 on 7870  Progress: 7649 on 7870  Progress: 7650 on 7870  Progress: 7651 on 7870  Progress: 7652 on 7870  Progress: 7653 on 7870  Progress: 7654 on 7870  Progress: 7655 on 7870  Progress: 7656 on 7870  Progress: 7657 on 7870  Progress: 7658 on 7870  Progress: 7659 on 7870  Progress: 7660 on 7870  Progress: 7661 on 7870  Progress: 7662 on 7870  Progress: 7663 on 7870  Progress: 7664 on 7870  Progress: 7665 on 7870  Progress: 7666 on 7870  Progress: 7667 on 7870  Progress: 7668 on 7870  Progress: 7669 on 7870  Progress: 7670 on 7870  Progress: 7671 on 7870  Progress: 7672 on 7870  Progress: 7673 on 7870  Progress: 7674 on 7870  Progress: 7675 on 7870  Progress: 7676 on 7870  Progress: 7677 on 7870  Progress: 7678 on 7870  Progress: 7679 on 7870  Progress: 7680 on 7870  Progress: 7681 on 7870  Progress: 7682 on 7870  Progress: 7683 on 7870  Progress: 7684 on 7870  Progress: 7685 on 7870  Progress: 7686 on 7870  Progress: 7687 on 7870  Progress: 7688 on 7870  Progress: 7689 on 7870  Progress: 7690 on 7870  Progress: 7691 on 7870  Progress: 7692 on 7870  Progress: 7693 on 7870  Progress: 7694 on 7870  Progress: 7695 on 7870  Progress: 7696 on 7870  Progress: 7697 on 7870  Progress: 7698 on 7870  Progress: 7699 on 7870  Progress: 7700 on 7870  Progress: 7701 on 7870  Progress: 7702 on 7870  Progress: 7703 on 7870  Progress: 7704 on 7870  Progress: 7705 on 7870  Progress: 7706 on 7870  Progress: 7707 on 7870  Progress: 7708 on 7870  Progress: 7709 on 7870  Progress: 7710 on 7870  Progress: 7711 on 7870  Progress: 7712 on 7870  Progress: 7713 on 7870  Progress: 7714 on 7870  Progress: 7715 on 7870  Progress: 7716 on 7870  Progress: 7717 on 7870  Progress: 7718 on 7870  Progress: 7719 on 7870  Progress: 7720 on 7870  Progress: 7721 on 7870  Progress: 7722 on 7870  Progress: 7723 on 7870  Progress: 7724 on 7870  Progress: 7725 on 7870  Progress: 7726 on 7870  Progress: 7727 on 7870  Progress: 7728 on 7870  Progress: 7729 on 7870  Progress: 7730 on 7870  Progress: 7731 on 7870  Progress: 7732 on 7870  Progress: 7733 on 7870  Progress: 7734 on 7870  Progress: 7735 on 7870  Progress: 7736 on 7870  Progress: 7737 on 7870  Progress: 7738 on 7870  Progress: 7739 on 7870  Progress: 7740 on 7870  Progress: 7741 on 7870  Progress: 7742 on 7870  Progress: 7743 on 7870  Progress: 7744 on 7870  Progress: 7745 on 7870  Progress: 7746 on 7870  Progress: 7747 on 7870  Progress: 7748 on 7870  Progress: 7749 on 7870  Progress: 7750 on 7870  Progress: 7751 on 7870  Progress: 7752 on 7870  Progress: 7753 on 7870  Progress: 7754 on 7870  Progress: 7755 on 7870  Progress: 7756 on 7870  Progress: 7757 on 7870  Progress: 7758 on 7870  Progress: 7759 on 7870  Progress: 7760 on 7870  Progress: 7761 on 7870  Progress: 7762 on 7870  Progress: 7763 on 7870  Progress: 7764 on 7870  Progress: 7765 on 7870  Progress: 7766 on 7870  Progress: 7767 on 7870  Progress: 7768 on 7870  Progress: 7769 on 7870  Progress: 7770 on 7870  Progress: 7771 on 7870  Progress: 7772 on 7870  Progress: 7773 on 7870  Progress: 7774 on 7870  Progress: 7775 on 7870  Progress: 7776 on 7870  Progress: 7777 on 7870  Progress: 7778 on 7870  Progress: 7779 on 7870  Progress: 7780 on 7870  Progress: 7781 on 7870  Progress: 7782 on 7870  Progress: 7783 on 7870  Progress: 7784 on 7870  Progress: 7785 on 7870  Progress: 7786 on 7870  Progress: 7787 on 7870  Progress: 7788 on 7870  Progress: 7789 on 7870  Progress: 7790 on 7870  Progress: 7791 on 7870  Progress: 7792 on 7870  Progress: 7793 on 7870  Progress: 7794 on 7870  Progress: 7795 on 7870  Progress: 7796 on 7870  Progress: 7797 on 7870  Progress: 7798 on 7870  Progress: 7799 on 7870  Progress: 7800 on 7870  Progress: 7801 on 7870  Progress: 7802 on 7870  Progress: 7803 on 7870  Progress: 7804 on 7870  Progress: 7805 on 7870  Progress: 7806 on 7870  Progress: 7807 on 7870  Progress: 7808 on 7870  Progress: 7809 on 7870  Progress: 7810 on 7870  Progress: 7811 on 7870  Progress: 7812 on 7870  Progress: 7813 on 7870  Progress: 7814 on 7870  Progress: 7815 on 7870  Progress: 7816 on 7870  Progress: 7817 on 7870  Progress: 7818 on 7870  Progress: 7819 on 7870  Progress: 7820 on 7870  Progress: 7821 on 7870  Progress: 7822 on 7870  Progress: 7823 on 7870  Progress: 7824 on 7870  Progress: 7825 on 7870  Progress: 7826 on 7870  Progress: 7827 on 7870  Progress: 7828 on 7870  Progress: 7829 on 7870  Progress: 7830 on 7870  Progress: 7831 on 7870  Progress: 7832 on 7870  Progress: 7833 on 7870  Progress: 7834 on 7870  Progress: 7835 on 7870  Progress: 7836 on 7870  Progress: 7837 on 7870  Progress: 7838 on 7870  Progress: 7839 on 7870  Progress: 7840 on 7870  Progress: 7841 on 7870  Progress: 7842 on 7870  Progress: 7843 on 7870  Progress: 7844 on 7870  Progress: 7845 on 7870  Progress: 7846 on 7870  Progress: 7847 on 7870  Progress: 7848 on 7870  Progress: 7849 on 7870  Progress: 7850 on 7870  Progress: 7851 on 7870  Progress: 7852 on 7870  Progress: 7853 on 7870  Progress: 7854 on 7870  Progress: 7855 on 7870  Progress: 7856 on 7870  Progress: 7857 on 7870  Progress: 7858 on 7870  Progress: 7859 on 7870  Progress: 7860 on 7870  Progress: 7861 on 7870  Progress: 7862 on 7870  Progress: 7863 on 7870  Progress: 7864 on 7870  Progress: 7865 on 7870  Progress: 7866 on 7870  Progress: 7867 on 7870  Progress: 7868 on 7870  Progress: 7869 on 7870  Progress: 7870 on 7870  
BN_autor <- BN_autor %>%
  mutate(ZA_ADNOTACJE = ifelse(czy_nazwisko==FALSE|czy_imie==FALSE,paste("UWAGA! Konflikt w danych osobowych w polach 100 i 245. Porównaj pole autor w formularzu z polem BN: ",X245c,sep = ""),NA)) %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,ZA_ADNOTACJE) %>%
  mutate(nazwa = str_replace_all(str_to_lower(paste(AM_NAZWISKO,AM_IMIE, sep = "")), "\\W", "")) %>%
  left_join(.,PBL_autorzy %>% select(AM_AUTOR_ID,AM_KRYPTONIM,AM_LICZBA_ZAPISOW,nazwa) %>% filter(is.na(AM_KRYPTONIM)),by="nazwa") %>%
  arrange(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,-AM_LICZBA_ZAPISOW)
BN_autor$id_grupy <- cumsum(!duplicated(BN_autor[1:3]))
BN_autor <- BN_autor[!duplicated(BN_autor$id_grupy),] %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,ZA_ADNOTACJE,AM_AUTOR_ID)

#3: tytuł
#pole 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
if("$n" %in% colnames(marc_field_245)) {
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = " "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = " "),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = " "),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  unite("ZA_TYTUL",`$a`:`$p`,sep = " ",na.rm = TRUE) %>% 
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL," +"," "),
         ZA_TYTUL = str_remove(ZA_TYTUL, "\\s+\\/\\s{0,}$"),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\.{3} \\.{3}","... "),
         ZA_TYTUL = str_replace_all(ZA_TYTUL," ; ",". "),
         ZA_TYTUL = gsub("( : )(.)",". \\U\\2",perl=TRUE,ZA_TYTUL)) %>%
  select(ZA_UWAGI,ZA_TYTUL)
} else {
  marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$a`,`$b`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = " "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  unite("ZA_TYTUL",`$a`:`$b`,sep = " ",na.rm = TRUE) %>% 
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL," +"," "),
         ZA_TYTUL = str_remove(ZA_TYTUL, "\\s+\\/\\s{0,}$"),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\.{3} \\.{3}","... "),
         ZA_TYTUL = str_replace_all(ZA_TYTUL," ; ",". "),
         ZA_TYTUL = gsub("( : )(.)",". \\U\\2",perl=TRUE,ZA_TYTUL)) %>%
  select(ZA_UWAGI,ZA_TYTUL)
}
#dopisanie gatunku do przedmiotowej na podstawie 655 i 650  
gatunki_pbl <- data.frame(gatunek = c("aforyzm", "album", "antologia", "autobiografia", "dziennik", "esej", "felieton", "inne", "kazanie", "list", "miniatura prozą", "opowiadanie", "poemat", "powieść", "proza", "proza poetycka", "reportaż", "rozmyślanie religijne", "rysunek, obraz", "scenariusz", "szkic", "tekst biblijny", "tekst dramatyczny", "dramat", "wiersz", "wspomnienia", "wypowiedź", "pamiętniki", "poezja", "literatura podróżnicza", "satyra", "piosenka"))

#dramat, pamiętniki, poezja, literatura podróżnicza, satyra, piosenka
gatunki_bn <- data %>%
  select(ZA_UWAGI,X655,X650)

gatunki_bn <- sqldf("select *
                    from gatunki_bn
                    left join gatunki_pbl on lower(gatunki_bn.X655) like '%'||gatunki_pbl.gatunek||'%'")
gatunki_bn <- sqldf("select *
                      from gatunki_bn
                      left join gatunki_pbl on lower(gatunki_bn.X650) like '%'||gatunki_pbl.gatunek||'%'")
colnames(gatunki_bn)[5] <- "gatunek2"
gatunki_bn <- gatunki_bn %>%
  mutate(gatunek = ifelse(is.na(gatunek)&!is.na(gatunek2),as.character(gatunek2),as.character(gatunek)),
         gatunek = ifelse(grepl("przypowieść",X655,ignore.case = TRUE)&!grepl("[^y]powieść",X655)&gatunek=="powieść","opowiadanie",as.character(gatunek))) %>%
  filter(!is.na(gatunek)) %>%
  select(ZA_UWAGI,gatunek) %>%
  mutate(gatunek = ifelse(gatunek=="dramat","tekst dramatyczny",
                          ifelse(gatunek=="pamiętniki","wspomnienia",
                                 ifelse(gatunek=="poezja","wiersz",
                                        ifelse(gatunek=="literatura podróżnicza","reportaż",
                                               ifelse(gatunek=="piosenka","wiersz",as.character(gatunek))))))) %>%
  group_by(ZA_UWAGI) %>%
  mutate(gatunek = paste(gatunek,collapse = ", ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(gatunek = gsub("(^.)","\\U\\1",perl = TRUE, gatunek))
#połączenie tytułu z gatunkiem
za_tytul <- marc_field_245 %>%
  left_join(.,gatunki_bn,by="ZA_UWAGI") %>% 
  mutate(gatunek = paste("[",gatunek,"]",sep = ""),
         gatunek = ifelse(gatunek=="[NA]",NA,as.character(gatunek))) %>% 
  unite("ZA_TYTUL", ZA_TYTUL:gatunek, sep = ". ",na.rm=TRUE) %>% 
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\. \\.",". "),
         ZA_TYTUL = str_replace(ZA_TYTUL,"(\\!)(\\.)|(\\?)(\\.)","\\1"))

#4: tytuł oryginału
#pole 246
marc_field_246 <- data %>%
  select(ZA_UWAGI,X246)%>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"~"),
         X246=str_replace_all(X246,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X246",sep = "~",direction = "long") %>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"^\\|")) %>%
  mutate(indicator = str_replace_all(X246,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X246,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_246)[1]))
colnames(empty_table) <-subfield_list
marc_field_246<-cbind(marc_field_246,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_246$X246 <- str_replace(marc_field_246$X246,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_246[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_246$X246),str_replace_all(gsub(string,"\\3",marc_field_246$X246),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
if("$n" %in% colnames(marc_field_246)) {
marc_field_246 <- marc_field_246[, colSums(is.na(marc_field_246)) != nrow(marc_field_246)] %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = ""),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = ""),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = "")) %>%
  ungroup() %>%
  unique() %>%
  unite("X246",`$a`:`$p`,sep = " ",na.rm = TRUE) %>% 
  mutate(X246 = str_replace_all(X246," +"," "),
         X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
         X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
  select(ZA_UWAGI, X246)
} else {
  marc_field_246 <- marc_field_246[, colSums(is.na(marc_field_246)) != nrow(marc_field_246)] %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`,`$b`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = "")) %>%
  ungroup() %>%
  unique() %>%
  unite("X246",`$a`:`$b`,sep = " ",na.rm = TRUE) %>% 
  mutate(X246 = str_replace_all(X246," +"," "),
         X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
         X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
  select(ZA_UWAGI, X246)
}

#pole 500
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"~"),
         X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  filter(grepl("oryg\\.\\:",X500)) %>%
  mutate(X500 = str_remove(`$a`,"^Tyt\\. oryg\\.: |^Tyt\\, oryg\\.: |^.*?tyt\\. oryg\\.: "),
         X500 = str_remove(X500, "\\s+\\/\\s{0,}$"),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = str_replace_all(X500,"\\.{3} \\.{3}","... "),
         X500 = str_remove(X500, "\\.$"),
         X500 = str_remove(X500,"(,{0,1} {0,1})\\d{4}.*$|(, t|. T)yt. oryg. cyklu:")) %>%
  select(ZA_UWAGI,X500)
#tytuł oryginału
za_tytul_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_246,by="ZA_UWAGI") %>%
  left_join(.,marc_field_500,by="ZA_UWAGI") %>%
  mutate(X500 = ifelse(is.na(X500),NA,
                       ifelse(grepl("oryg",X500),NA,as.character(X500))),
         X500 = ifelse(!is.na(X500)&grepl("\\. - ",X500),str_replace(X500,"(.*?)(\\. - .*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Na książce pseud",X500),str_replace(X500,"(.*?)(\\. Na książce pseud.*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Przekł\\. wg",X500),str_replace(X500,"(.*?)(\\. Przekł\\. wg.*$)","\\1"),as.character(X500)),
         ZA_TYTUL_ORYGINALU = ifelse(is.na(X246)&is.na(X500),NA,
                                     ifelse(!is.na(X500),as.character(X500),as.character(X246))),
         ZA_TYTUL_ORYGINALU = str_remove_all(ZA_TYTUL_ORYGINALU,'\\"')) %>%
  select(ZA_UWAGI,ZA_TYTUL_ORYGINALU)
#5: język oryginału
marc_field_041 <- data %>%
  select(ZA_UWAGI,X041)%>%
  filter(X041!="") %>%
  mutate(X041=str_replace_all(X041,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X041",sep = "~",direction = "long") %>%
  filter(X041!="") %>%
  mutate(X041=str_remove_all(X041,"^\\|")) %>%
  mutate(indicator = str_replace_all(X041,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X041,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_041)[1]))
colnames(empty_table) <-subfield_list
marc_field_041<-cbind(marc_field_041,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_041$X041 <- str_replace(marc_field_041$X041,subfield_list_char[i],"|\\1")
}
Progress: 1 on 8  Progress: 2 on 8  Progress: 3 on 8  Progress: 4 on 8  Progress: 5 on 8  Progress: 6 on 8  Progress: 7 on 8  Progress: 8 on 8  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_041[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_041$X041),str_replace_all(gsub(string,"\\3",marc_field_041$X041),"\\${2}.", "~"),NA)
}
Progress: 1 on 8  Progress: 2 on 8  Progress: 3 on 8  Progress: 4 on 8  Progress: 5 on 8  Progress: 6 on 8  Progress: 7 on 8  Progress: 8 on 8  
za_jezyk_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_041 %>% select(ZA_UWAGI,ZA_JEZYK_ORYGINALU = `$a`),by="ZA_UWAGI") %>%
  mutate(ZA_JEZYK_ORYGINALU = str_replace_all(ZA_JEZYK_ORYGINALU,"\\$a",",")) %>%
  unique()

#6: współtwórcy
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
Progress:  1 on 14  Progress:  2 on 14  Progress:  3 on 14  Progress:  4 on 14  Progress:  5 on 14  Progress:  6 on 14  Progress:  7 on 14  Progress:  8 on 14  Progress:  9 on 14  Progress: 10 on 14  Progress: 11 on 14  Progress: 12 on 14  Progress: 13 on 14  Progress: 14 on 14  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
Progress:  1 on 14  Progress:  2 on 14  Progress:  3 on 14  Progress:  4 on 14  Progress:  5 on 14  Progress:  6 on 14  Progress:  7 on 14  Progress:  8 on 14  Progress:  9 on 14  Progress: 10 on 14  Progress: 11 on 14  Progress: 12 on 14  Progress: 13 on 14  Progress: 14 on 14  
BN_wspoltworca <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         ws_prosty = str_replace_all(str_to_lower(osoba), "\\W", ""),
         fu_prosta = str_replace_all(str_to_lower(funkcja), "\\W", "")) %>%
  left_join(.,PBL_wspoltworcy %>% select(OS_OSOBA_ID,OS_LICZBA_ZAPISOW,nazwa_prosta),by=c("ws_prosty"="nazwa_prosta")) %>%
  arrange(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,-OS_LICZBA_ZAPISOW)
BN_wspoltworca$id_grupy <- cumsum(!duplicated(BN_wspoltworca[1:2]))
BN_wspoltworca <- BN_wspoltworca[!duplicated(BN_wspoltworca$id_grupy),] %>%
  left_join(.,PBL_funkcje,by=c("fu_prosta"="nazwa")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL",NA,as.character(fo_symbol))) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja)

#tutaj przeszukać X245 i znaleźć błędy współtwórców
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`)

BN_wspoltworca <- BN_wspoltworca %>%
  left_join(.,marc_field_245,by="ZA_UWAGI")

x <- 1:lengths(BN_wspoltworca[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_wspoltworca$czy_nazwisko[i] <- str_detect(BN_wspoltworca$X245c[i],BN_wspoltworca$OS_NAZWISKO[i])
  BN_wspoltworca$czy_imie[i] <- grepl(BN_wspoltworca$OS_IMIE[i],BN_wspoltworca$X245c[i])
}
Progress:    1 on 5638  Progress:    2 on 5638  Progress:    3 on 5638  Progress:    4 on 5638  Progress:    5 on 5638  Progress:    6 on 5638  Progress:    7 on 5638  Progress:    8 on 5638  Progress:    9 on 5638  Progress:   10 on 5638  Progress:   11 on 5638  Progress:   12 on 5638  Progress:   13 on 5638  Progress:   14 on 5638  Progress:   15 on 5638  Progress:   16 on 5638  Progress:   17 on 5638  Progress:   18 on 5638  Progress:   19 on 5638  Progress:   20 on 5638  Progress:   21 on 5638  Progress:   22 on 5638  Progress:   23 on 5638  Progress:   24 on 5638  Progress:   25 on 5638  Progress:   26 on 5638  Progress:   27 on 5638  Progress:   28 on 5638  Progress:   29 on 5638  Progress:   30 on 5638  Progress:   31 on 5638  Progress:   32 on 5638  Progress:   33 on 5638  Progress:   34 on 5638  Progress:   35 on 5638  Progress:   36 on 5638  Progress:   37 on 5638  Progress:   38 on 5638  Progress:   39 on 5638  Progress:   40 on 5638  Progress:   41 on 5638  Progress:   42 on 5638  Progress:   43 on 5638  Progress:   44 on 5638  Progress:   45 on 5638  Progress:   46 on 5638  Progress:   47 on 5638  Progress:   48 on 5638  Progress:   49 on 5638  Progress:   50 on 5638  Progress:   51 on 5638  Progress:   52 on 5638  Progress:   53 on 5638  Progress:   54 on 5638  Progress:   55 on 5638  Progress:   56 on 5638  Progress:   57 on 5638  Progress:   58 on 5638  Progress:   59 on 5638  Progress:   60 on 5638  Progress:   61 on 5638  Progress:   62 on 5638  Progress:   63 on 5638  Progress:   64 on 5638  Progress:   65 on 5638  Progress:   66 on 5638  Progress:   67 on 5638  Progress:   68 on 5638  Progress:   69 on 5638  Progress:   70 on 5638  Progress:   71 on 5638  Progress:   72 on 5638  Progress:   73 on 5638  Progress:   74 on 5638  Progress:   75 on 5638  Progress:   76 on 5638  Progress:   77 on 5638  Progress:   78 on 5638  Progress:   79 on 5638  Progress:   80 on 5638  Progress:   81 on 5638  Progress:   82 on 5638  Progress:   83 on 5638  Progress:   84 on 5638  Progress:   85 on 5638  Progress:   86 on 5638  Progress:   87 on 5638  Progress:   88 on 5638  Progress:   89 on 5638  Progress:   90 on 5638  Progress:   91 on 5638  Progress:   92 on 5638  Progress:   93 on 5638  Progress:   94 on 5638  Progress:   95 on 5638  Progress:   96 on 5638  Progress:   97 on 5638  Progress:   98 on 5638  Progress:   99 on 5638  Progress:  100 on 5638  Progress:  101 on 5638  Progress:  102 on 5638  Progress:  103 on 5638  Progress:  104 on 5638  Progress:  105 on 5638  Progress:  106 on 5638  Progress:  107 on 5638  Progress:  108 on 5638  Progress:  109 on 5638  Progress:  110 on 5638  Progress:  111 on 5638  Progress:  112 on 5638  Progress:  113 on 5638  Progress:  114 on 5638  Progress:  115 on 5638  Progress:  116 on 5638  Progress:  117 on 5638  Progress:  118 on 5638  Progress:  119 on 5638  Progress:  120 on 5638  Progress:  121 on 5638  Progress:  122 on 5638  Progress:  123 on 5638  Progress:  124 on 5638  Progress:  125 on 5638  Progress:  126 on 5638  Progress:  127 on 5638  Progress:  128 on 5638  Progress:  129 on 5638  Progress:  130 on 5638  Progress:  131 on 5638  Progress:  132 on 5638  Progress:  133 on 5638  Progress:  134 on 5638  Progress:  135 on 5638  Progress:  136 on 5638  Progress:  137 on 5638  Progress:  138 on 5638  Progress:  139 on 5638  Progress:  140 on 5638  Progress:  141 on 5638  Progress:  142 on 5638  Progress:  143 on 5638  Progress:  144 on 5638  Progress:  145 on 5638  Progress:  146 on 5638  Progress:  147 on 5638  Progress:  148 on 5638  Progress:  149 on 5638  Progress:  150 on 5638  Progress:  151 on 5638  Progress:  152 on 5638  Progress:  153 on 5638  Progress:  154 on 5638  Progress:  155 on 5638  Progress:  156 on 5638  Progress:  157 on 5638  Progress:  158 on 5638  Progress:  159 on 5638  Progress:  160 on 5638  Progress:  161 on 5638  Progress:  162 on 5638  Progress:  163 on 5638  Progress:  164 on 5638  Progress:  165 on 5638  Progress:  166 on 5638  Progress:  167 on 5638  Progress:  168 on 5638  Progress:  169 on 5638  Progress:  170 on 5638  Progress:  171 on 5638  Progress:  172 on 5638  Progress:  173 on 5638  Progress:  174 on 5638  Progress:  175 on 5638  Progress:  176 on 5638  Progress:  177 on 5638  Progress:  178 on 5638  Progress:  179 on 5638  Progress:  180 on 5638  Progress:  181 on 5638  Progress:  182 on 5638  Progress:  183 on 5638  Progress:  184 on 5638  Progress:  185 on 5638  Progress:  186 on 5638  Progress:  187 on 5638  Progress:  188 on 5638  Progress:  189 on 5638  Progress:  190 on 5638  Progress:  191 on 5638  Progress:  192 on 5638  Progress:  193 on 5638  Progress:  194 on 5638  Progress:  195 on 5638  Progress:  196 on 5638  Progress:  197 on 5638  Progress:  198 on 5638  Progress:  199 on 5638  Progress:  200 on 5638  Progress:  201 on 5638  Progress:  202 on 5638  Progress:  203 on 5638  Progress:  204 on 5638  Progress:  205 on 5638  Progress:  206 on 5638  Progress:  207 on 5638  Progress:  208 on 5638  Progress:  209 on 5638  Progress:  210 on 5638  Progress:  211 on 5638  Progress:  212 on 5638  Progress:  213 on 5638  Progress:  214 on 5638  Progress:  215 on 5638  Progress:  216 on 5638  Progress:  217 on 5638  Progress:  218 on 5638  Progress:  219 on 5638  Progress:  220 on 5638  Progress:  221 on 5638  Progress:  222 on 5638  Progress:  223 on 5638  Progress:  224 on 5638  Progress:  225 on 5638  Progress:  226 on 5638  Progress:  227 on 5638  Progress:  228 on 5638  Progress:  229 on 5638  Progress:  230 on 5638  Progress:  231 on 5638  Progress:  232 on 5638  Progress:  233 on 5638  Progress:  234 on 5638  Progress:  235 on 5638  Progress:  236 on 5638  Progress:  237 on 5638  Progress:  238 on 5638  Progress:  239 on 5638  Progress:  240 on 5638  Progress:  241 on 5638  Progress:  242 on 5638  Progress:  243 on 5638  Progress:  244 on 5638  Progress:  245 on 5638  Progress:  246 on 5638  Progress:  247 on 5638  Progress:  248 on 5638  Progress:  249 on 5638  Progress:  250 on 5638  Progress:  251 on 5638  Progress:  252 on 5638  Progress:  253 on 5638  Progress:  254 on 5638  Progress:  255 on 5638  Progress:  256 on 5638  Progress:  257 on 5638  Progress:  258 on 5638  Progress:  259 on 5638  Progress:  260 on 5638  Progress:  261 on 5638  Progress:  262 on 5638  Progress:  263 on 5638  Progress:  264 on 5638  Progress:  265 on 5638  Progress:  266 on 5638  Progress:  267 on 5638  Progress:  268 on 5638  Progress:  269 on 5638  Progress:  270 on 5638  Progress:  271 on 5638  Progress:  272 on 5638  Progress:  273 on 5638  Progress:  274 on 5638  Progress:  275 on 5638  Progress:  276 on 5638  Progress:  277 on 5638  Progress:  278 on 5638  Progress:  279 on 5638  Progress:  280 on 5638  Progress:  281 on 5638  Progress:  282 on 5638  Progress:  283 on 5638  Progress:  284 on 5638  Progress:  285 on 5638  Progress:  286 on 5638  Progress:  287 on 5638  Progress:  288 on 5638  Progress:  289 on 5638  Progress:  290 on 5638  Progress:  291 on 5638  Progress:  292 on 5638  Progress:  293 on 5638  Progress:  294 on 5638  Progress:  295 on 5638  Progress:  296 on 5638  Progress:  297 on 5638  Progress:  298 on 5638  Progress:  299 on 5638  Progress:  300 on 5638  Progress:  301 on 5638  Progress:  302 on 5638  Progress:  303 on 5638  Progress:  304 on 5638  Progress:  305 on 5638  Progress:  306 on 5638  Progress:  307 on 5638  Progress:  308 on 5638  Progress:  309 on 5638  Progress:  310 on 5638  Progress:  311 on 5638  Progress:  312 on 5638  Progress:  313 on 5638  Progress:  314 on 5638  Progress:  315 on 5638  Progress:  316 on 5638  Progress:  317 on 5638  Progress:  318 on 5638  Progress:  319 on 5638  Progress:  320 on 5638  Progress:  321 on 5638  Progress:  322 on 5638  Progress:  323 on 5638  Progress:  324 on 5638  Progress:  325 on 5638  Progress:  326 on 5638  Progress:  327 on 5638  Progress:  328 on 5638  Progress:  329 on 5638  Progress:  330 on 5638  Progress:  331 on 5638  Progress:  332 on 5638  Progress:  333 on 5638  Progress:  334 on 5638  Progress:  335 on 5638  Progress:  336 on 5638  Progress:  337 on 5638  Progress:  338 on 5638  Progress:  339 on 5638  Progress:  340 on 5638  Progress:  341 on 5638  Progress:  342 on 5638  Progress:  343 on 5638  Progress:  344 on 5638  Progress:  345 on 5638  Progress:  346 on 5638  Progress:  347 on 5638  Progress:  348 on 5638  Progress:  349 on 5638  Progress:  350 on 5638  Progress:  351 on 5638  Progress:  352 on 5638  Progress:  353 on 5638  Progress:  354 on 5638  Progress:  355 on 5638  Progress:  356 on 5638  Progress:  357 on 5638  Progress:  358 on 5638  Progress:  359 on 5638  Progress:  360 on 5638  Progress:  361 on 5638  Progress:  362 on 5638  Progress:  363 on 5638  Progress:  364 on 5638  Progress:  365 on 5638  Progress:  366 on 5638  Progress:  367 on 5638  Progress:  368 on 5638  Progress:  369 on 5638  Progress:  370 on 5638  Progress:  371 on 5638  Progress:  372 on 5638  Progress:  373 on 5638  Progress:  374 on 5638  Progress:  375 on 5638  Progress:  376 on 5638  Progress:  377 on 5638  Progress:  378 on 5638  Progress:  379 on 5638  Progress:  380 on 5638  Progress:  381 on 5638  Progress:  382 on 5638  Progress:  383 on 5638  Progress:  384 on 5638  Progress:  385 on 5638  Progress:  386 on 5638  Progress:  387 on 5638  Progress:  388 on 5638  Progress:  389 on 5638  Progress:  390 on 5638  Progress:  391 on 5638  Progress:  392 on 5638  Progress:  393 on 5638  Progress:  394 on 5638  Progress:  395 on 5638  Progress:  396 on 5638  Progress:  397 on 5638  Progress:  398 on 5638  Progress:  399 on 5638  Progress:  400 on 5638  Progress:  401 on 5638  Progress:  402 on 5638  Progress:  403 on 5638  Progress:  404 on 5638  Progress:  405 on 5638  Progress:  406 on 5638  Progress:  407 on 5638  Progress:  408 on 5638  Progress:  409 on 5638  Progress:  410 on 5638  Progress:  411 on 5638  Progress:  412 on 5638  Progress:  413 on 5638  Progress:  414 on 5638  Progress:  415 on 5638  Progress:  416 on 5638  Progress:  417 on 5638  Progress:  418 on 5638  Progress:  419 on 5638  Progress:  420 on 5638  Progress:  421 on 5638  Progress:  422 on 5638  Progress:  423 on 5638  Progress:  424 on 5638  Progress:  425 on 5638  Progress:  426 on 5638  Progress:  427 on 5638  Progress:  428 on 5638  Progress:  429 on 5638  Progress:  430 on 5638  Progress:  431 on 5638  Progress:  432 on 5638  Progress:  433 on 5638  Progress:  434 on 5638  Progress:  435 on 5638  Progress:  436 on 5638  Progress:  437 on 5638  Progress:  438 on 5638  Progress:  439 on 5638  Progress:  440 on 5638  Progress:  441 on 5638  Progress:  442 on 5638  Progress:  443 on 5638  Progress:  444 on 5638  Progress:  445 on 5638  Progress:  446 on 5638  Progress:  447 on 5638  Progress:  448 on 5638  Progress:  449 on 5638  Progress:  450 on 5638  Progress:  451 on 5638  Progress:  452 on 5638  Progress:  453 on 5638  Progress:  454 on 5638  Progress:  455 on 5638  Progress:  456 on 5638  Progress:  457 on 5638  Progress:  458 on 5638  Progress:  459 on 5638  Progress:  460 on 5638  Progress:  461 on 5638  Progress:  462 on 5638  Progress:  463 on 5638  Progress:  464 on 5638  Progress:  465 on 5638  Progress:  466 on 5638  Progress:  467 on 5638  Progress:  468 on 5638  Progress:  469 on 5638  Progress:  470 on 5638  Progress:  471 on 5638  Progress:  472 on 5638  Progress:  473 on 5638  Progress:  474 on 5638  Progress:  475 on 5638  Progress:  476 on 5638  Progress:  477 on 5638  Progress:  478 on 5638  Progress:  479 on 5638  Progress:  480 on 5638  Progress:  481 on 5638  Progress:  482 on 5638  Progress:  483 on 5638  Progress:  484 on 5638  Progress:  485 on 5638  Progress:  486 on 5638  Progress:  487 on 5638  Progress:  488 on 5638  Progress:  489 on 5638  Progress:  490 on 5638  Progress:  491 on 5638  Progress:  492 on 5638  Progress:  493 on 5638  Progress:  494 on 5638  Progress:  495 on 5638  Progress:  496 on 5638  Progress:  497 on 5638  Progress:  498 on 5638  Progress:  499 on 5638  Progress:  500 on 5638  Progress:  501 on 5638  Progress:  502 on 5638  Progress:  503 on 5638  Progress:  504 on 5638  Progress:  505 on 5638  Progress:  506 on 5638  Progress:  507 on 5638  Progress:  508 on 5638  Progress:  509 on 5638  Progress:  510 on 5638  Progress:  511 on 5638  Progress:  512 on 5638  Progress:  513 on 5638  Progress:  514 on 5638  Progress:  515 on 5638  Progress:  516 on 5638  Progress:  517 on 5638  Progress:  518 on 5638  Progress:  519 on 5638  Progress:  520 on 5638  Progress:  521 on 5638  Progress:  522 on 5638  Progress:  523 on 5638  Progress:  524 on 5638  Progress:  525 on 5638  Progress:  526 on 5638  Progress:  527 on 5638  Progress:  528 on 5638  Progress:  529 on 5638  Progress:  530 on 5638  Progress:  531 on 5638  Progress:  532 on 5638  Progress:  533 on 5638  Progress:  534 on 5638  Progress:  535 on 5638  Progress:  536 on 5638  Progress:  537 on 5638  Progress:  538 on 5638  Progress:  539 on 5638  Progress:  540 on 5638  Progress:  541 on 5638  Progress:  542 on 5638  Progress:  543 on 5638  Progress:  544 on 5638  Progress:  545 on 5638  Progress:  546 on 5638  Progress:  547 on 5638  Progress:  548 on 5638  Progress:  549 on 5638  Progress:  550 on 5638  Progress:  551 on 5638  Progress:  552 on 5638  Progress:  553 on 5638  Progress:  554 on 5638  Progress:  555 on 5638  Progress:  556 on 5638  Progress:  557 on 5638  Progress:  558 on 5638  Progress:  559 on 5638  Progress:  560 on 5638  Progress:  561 on 5638  Progress:  562 on 5638  Progress:  563 on 5638  Progress:  564 on 5638  Progress:  565 on 5638  Progress:  566 on 5638  Progress:  567 on 5638  Progress:  568 on 5638  Progress:  569 on 5638  Progress:  570 on 5638  Progress:  571 on 5638  Progress:  572 on 5638  Progress:  573 on 5638  Progress:  574 on 5638  Progress:  575 on 5638  Progress:  576 on 5638  Progress:  577 on 5638  Progress:  578 on 5638  Progress:  579 on 5638  Progress:  580 on 5638  Progress:  581 on 5638  Progress:  582 on 5638  Progress:  583 on 5638  Progress:  584 on 5638  Progress:  585 on 5638  Progress:  586 on 5638  Progress:  587 on 5638  Progress:  588 on 5638  Progress:  589 on 5638  Progress:  590 on 5638  Progress:  591 on 5638  Progress:  592 on 5638  Progress:  593 on 5638  Progress:  594 on 5638  Progress:  595 on 5638  Progress:  596 on 5638  Progress:  597 on 5638  Progress:  598 on 5638  Progress:  599 on 5638  Progress:  600 on 5638  Progress:  601 on 5638  Progress:  602 on 5638  Progress:  603 on 5638  Progress:  604 on 5638  Progress:  605 on 5638  Progress:  606 on 5638  Progress:  607 on 5638  Progress:  608 on 5638  Progress:  609 on 5638  Progress:  610 on 5638  Progress:  611 on 5638  Progress:  612 on 5638  Progress:  613 on 5638  Progress:  614 on 5638  Progress:  615 on 5638  Progress:  616 on 5638  Progress:  617 on 5638  Progress:  618 on 5638  Progress:  619 on 5638  Progress:  620 on 5638  Progress:  621 on 5638  Progress:  622 on 5638  Progress:  623 on 5638  Progress:  624 on 5638  Progress:  625 on 5638  Progress:  626 on 5638  Progress:  627 on 5638  Progress:  628 on 5638  Progress:  629 on 5638  Progress:  630 on 5638  Progress:  631 on 5638  Progress:  632 on 5638  Progress:  633 on 5638  Progress:  634 on 5638  Progress:  635 on 5638  Progress:  636 on 5638  Progress:  637 on 5638  Progress:  638 on 5638  Progress:  639 on 5638  Progress:  640 on 5638  Progress:  641 on 5638  Progress:  642 on 5638  Progress:  643 on 5638  Progress:  644 on 5638  Progress:  645 on 5638  Progress:  646 on 5638  Progress:  647 on 5638  Progress:  648 on 5638  Progress:  649 on 5638  Progress:  650 on 5638  Progress:  651 on 5638  Progress:  652 on 5638  Progress:  653 on 5638  Progress:  654 on 5638  Progress:  655 on 5638  Progress:  656 on 5638  Progress:  657 on 5638  Progress:  658 on 5638  Progress:  659 on 5638  Progress:  660 on 5638  Progress:  661 on 5638  Progress:  662 on 5638  Progress:  663 on 5638  Progress:  664 on 5638  Progress:  665 on 5638  Progress:  666 on 5638  Progress:  667 on 5638  Progress:  668 on 5638  Progress:  669 on 5638  Progress:  670 on 5638  Progress:  671 on 5638  Progress:  672 on 5638  Progress:  673 on 5638  Progress:  674 on 5638  Progress:  675 on 5638  Progress:  676 on 5638  Progress:  677 on 5638  Progress:  678 on 5638  Progress:  679 on 5638  Progress:  680 on 5638  Progress:  681 on 5638  Progress:  682 on 5638  Progress:  683 on 5638  Progress:  684 on 5638  Progress:  685 on 5638  Progress:  686 on 5638  Progress:  687 on 5638  Progress:  688 on 5638  Progress:  689 on 5638  Progress:  690 on 5638  Progress:  691 on 5638  Progress:  692 on 5638  Progress:  693 on 5638  Progress:  694 on 5638  Progress:  695 on 5638  Progress:  696 on 5638  Progress:  697 on 5638  Progress:  698 on 5638  Progress:  699 on 5638  Progress:  700 on 5638  Progress:  701 on 5638  Progress:  702 on 5638  Progress:  703 on 5638  Progress:  704 on 5638  Progress:  705 on 5638  Progress:  706 on 5638  Progress:  707 on 5638  Progress:  708 on 5638  Progress:  709 on 5638  Progress:  710 on 5638  Progress:  711 on 5638  Progress:  712 on 5638  Progress:  713 on 5638  Progress:  714 on 5638  Progress:  715 on 5638  Progress:  716 on 5638  Progress:  717 on 5638  Progress:  718 on 5638  Progress:  719 on 5638  Progress:  720 on 5638  Progress:  721 on 5638  Progress:  722 on 5638  Progress:  723 on 5638  Progress:  724 on 5638  Progress:  725 on 5638  Progress:  726 on 5638  Progress:  727 on 5638  Progress:  728 on 5638  Progress:  729 on 5638  Progress:  730 on 5638  Progress:  731 on 5638  Progress:  732 on 5638  Progress:  733 on 5638  Progress:  734 on 5638  Progress:  735 on 5638  Progress:  736 on 5638  Progress:  737 on 5638  Progress:  738 on 5638  Progress:  739 on 5638  Progress:  740 on 5638  Progress:  741 on 5638  Progress:  742 on 5638  Progress:  743 on 5638  Progress:  744 on 5638  Progress:  745 on 5638  Progress:  746 on 5638  Progress:  747 on 5638  Progress:  748 on 5638  Progress:  749 on 5638  Progress:  750 on 5638  Progress:  751 on 5638  Progress:  752 on 5638  Progress:  753 on 5638  Progress:  754 on 5638  Progress:  755 on 5638  Progress:  756 on 5638  Progress:  757 on 5638  Progress:  758 on 5638  Progress:  759 on 5638  Progress:  760 on 5638  Progress:  761 on 5638  Progress:  762 on 5638  Progress:  763 on 5638  Progress:  764 on 5638  Progress:  765 on 5638  Progress:  766 on 5638  Progress:  767 on 5638  Progress:  768 on 5638  Progress:  769 on 5638  Progress:  770 on 5638  Progress:  771 on 5638  Progress:  772 on 5638  Progress:  773 on 5638  Progress:  774 on 5638  Progress:  775 on 5638  Progress:  776 on 5638  Progress:  777 on 5638  Progress:  778 on 5638  Progress:  779 on 5638  Progress:  780 on 5638  Progress:  781 on 5638  Progress:  782 on 5638  Progress:  783 on 5638  Progress:  784 on 5638  Progress:  785 on 5638  Progress:  786 on 5638  Progress:  787 on 5638  Progress:  788 on 5638  Progress:  789 on 5638  Progress:  790 on 5638  Progress:  791 on 5638  Progress:  792 on 5638  Progress:  793 on 5638  Progress:  794 on 5638  Progress:  795 on 5638  Progress:  796 on 5638  Progress:  797 on 5638  Progress:  798 on 5638  Progress:  799 on 5638  Progress:  800 on 5638  Progress:  801 on 5638  Progress:  802 on 5638  Progress:  803 on 5638  Progress:  804 on 5638  Progress:  805 on 5638  Progress:  806 on 5638  Progress:  807 on 5638  Progress:  808 on 5638  Progress:  809 on 5638  Progress:  810 on 5638  Progress:  811 on 5638  Progress:  812 on 5638  Progress:  813 on 5638  Progress:  814 on 5638  Progress:  815 on 5638  Progress:  816 on 5638  Progress:  817 on 5638  Progress:  818 on 5638  Progress:  819 on 5638  Progress:  820 on 5638  Progress:  821 on 5638  Progress:  822 on 5638  Progress:  823 on 5638  Progress:  824 on 5638  Progress:  825 on 5638  Progress:  826 on 5638  Progress:  827 on 5638  Progress:  828 on 5638  Progress:  829 on 5638  Progress:  830 on 5638  Progress:  831 on 5638  Progress:  832 on 5638  Progress:  833 on 5638  Progress:  834 on 5638  Progress:  835 on 5638  Progress:  836 on 5638  Progress:  837 on 5638  Progress:  838 on 5638  Progress:  839 on 5638  Progress:  840 on 5638  Progress:  841 on 5638  Progress:  842 on 5638  Progress:  843 on 5638  Progress:  844 on 5638  Progress:  845 on 5638  Progress:  846 on 5638  Progress:  847 on 5638  Progress:  848 on 5638  Progress:  849 on 5638  Progress:  850 on 5638  Progress:  851 on 5638  Progress:  852 on 5638  Progress:  853 on 5638  Progress:  854 on 5638  Progress:  855 on 5638  Progress:  856 on 5638  Progress:  857 on 5638  Progress:  858 on 5638  Progress:  859 on 5638  Progress:  860 on 5638  Progress:  861 on 5638  Progress:  862 on 5638  Progress:  863 on 5638  Progress:  864 on 5638  Progress:  865 on 5638  Progress:  866 on 5638  Progress:  867 on 5638  Progress:  868 on 5638  Progress:  869 on 5638  Progress:  870 on 5638  Progress:  871 on 5638  Progress:  872 on 5638  Progress:  873 on 5638  Progress:  874 on 5638  Progress:  875 on 5638  Progress:  876 on 5638  Progress:  877 on 5638  Progress:  878 on 5638  Progress:  879 on 5638  Progress:  880 on 5638  Progress:  881 on 5638  Progress:  882 on 5638  Progress:  883 on 5638  Progress:  884 on 5638  Progress:  885 on 5638  Progress:  886 on 5638  Progress:  887 on 5638  Progress:  888 on 5638  Progress:  889 on 5638  Progress:  890 on 5638  Progress:  891 on 5638  Progress:  892 on 5638  Progress:  893 on 5638  Progress:  894 on 5638  Progress:  895 on 5638  Progress:  896 on 5638  Progress:  897 on 5638  Progress:  898 on 5638  Progress:  899 on 5638  Progress:  900 on 5638  Progress:  901 on 5638  Progress:  902 on 5638  Progress:  903 on 5638  Progress:  904 on 5638  Progress:  905 on 5638  Progress:  906 on 5638  Progress:  907 on 5638  Progress:  908 on 5638  Progress:  909 on 5638  Progress:  910 on 5638  Progress:  911 on 5638  Progress:  912 on 5638  Progress:  913 on 5638  Progress:  914 on 5638  Progress:  915 on 5638  Progress:  916 on 5638  Progress:  917 on 5638  Progress:  918 on 5638  Progress:  919 on 5638  Progress:  920 on 5638  Progress:  921 on 5638  Progress:  922 on 5638  Progress:  923 on 5638  Progress:  924 on 5638  Progress:  925 on 5638  Progress:  926 on 5638  Progress:  927 on 5638  Progress:  928 on 5638  Progress:  929 on 5638  Progress:  930 on 5638  Progress:  931 on 5638  Progress:  932 on 5638  Progress:  933 on 5638  Progress:  934 on 5638  Progress:  935 on 5638  Progress:  936 on 5638  Progress:  937 on 5638  Progress:  938 on 5638  Progress:  939 on 5638  Progress:  940 on 5638  Progress:  941 on 5638  Progress:  942 on 5638  Progress:  943 on 5638  Progress:  944 on 5638  Progress:  945 on 5638  Progress:  946 on 5638  Progress:  947 on 5638  Progress:  948 on 5638  Progress:  949 on 5638  Progress:  950 on 5638  Progress:  951 on 5638  Progress:  952 on 5638  Progress:  953 on 5638  Progress:  954 on 5638  Progress:  955 on 5638  Progress:  956 on 5638  Progress:  957 on 5638  Progress:  958 on 5638  Progress:  959 on 5638  Progress:  960 on 5638  Progress:  961 on 5638  Progress:  962 on 5638  Progress:  963 on 5638  Progress:  964 on 5638  Progress:  965 on 5638  Progress:  966 on 5638  Progress:  967 on 5638  Progress:  968 on 5638  Progress:  969 on 5638  Progress:  970 on 5638  Progress:  971 on 5638  Progress:  972 on 5638  Progress:  973 on 5638  Progress:  974 on 5638  Progress:  975 on 5638  Progress:  976 on 5638  Progress:  977 on 5638  Progress:  978 on 5638  Progress:  979 on 5638  Progress:  980 on 5638  Progress:  981 on 5638  Progress:  982 on 5638  Progress:  983 on 5638  Progress:  984 on 5638  Progress:  985 on 5638  Progress:  986 on 5638  Progress:  987 on 5638  Progress:  988 on 5638  Progress:  989 on 5638  Progress:  990 on 5638  Progress:  991 on 5638  Progress:  992 on 5638  Progress:  993 on 5638  Progress:  994 on 5638  Progress:  995 on 5638  Progress:  996 on 5638  Progress:  997 on 5638  Progress:  998 on 5638  Progress:  999 on 5638  Progress: 1000 on 5638  Progress: 1001 on 5638  Progress: 1002 on 5638  Progress: 1003 on 5638  Progress: 1004 on 5638  Progress: 1005 on 5638  Progress: 1006 on 5638  Progress: 1007 on 5638  Progress: 1008 on 5638  Progress: 1009 on 5638  Progress: 1010 on 5638  Progress: 1011 on 5638  Progress: 1012 on 5638  Progress: 1013 on 5638  Progress: 1014 on 5638  Progress: 1015 on 5638  Progress: 1016 on 5638  Progress: 1017 on 5638  Progress: 1018 on 5638  Progress: 1019 on 5638  Progress: 1020 on 5638  Progress: 1021 on 5638  Progress: 1022 on 5638  Progress: 1023 on 5638  Progress: 1024 on 5638  Progress: 1025 on 5638  Progress: 1026 on 5638  Progress: 1027 on 5638  Progress: 1028 on 5638  Progress: 1029 on 5638  Progress: 1030 on 5638  Progress: 1031 on 5638  Progress: 1032 on 5638  Progress: 1033 on 5638  Progress: 1034 on 5638  Progress: 1035 on 5638  Progress: 1036 on 5638  Progress: 1037 on 5638  Progress: 1038 on 5638  Progress: 1039 on 5638  Progress: 1040 on 5638  Progress: 1041 on 5638  Progress: 1042 on 5638  Progress: 1043 on 5638  Progress: 1044 on 5638  Progress: 1045 on 5638  Progress: 1046 on 5638  Progress: 1047 on 5638  Progress: 1048 on 5638  Progress: 1049 on 5638  Progress: 1050 on 5638  Progress: 1051 on 5638  Progress: 1052 on 5638  Progress: 1053 on 5638  Progress: 1054 on 5638  Progress: 1055 on 5638  Progress: 1056 on 5638  Progress: 1057 on 5638  Progress: 1058 on 5638  Progress: 1059 on 5638  Progress: 1060 on 5638  Progress: 1061 on 5638  Progress: 1062 on 5638  Progress: 1063 on 5638  Progress: 1064 on 5638  Progress: 1065 on 5638  Progress: 1066 on 5638  Progress: 1067 on 5638  Progress: 1068 on 5638  Progress: 1069 on 5638  Progress: 1070 on 5638  Progress: 1071 on 5638  Progress: 1072 on 5638  Progress: 1073 on 5638  Progress: 1074 on 5638  Progress: 1075 on 5638  Progress: 1076 on 5638  Progress: 1077 on 5638  Progress: 1078 on 5638  Progress: 1079 on 5638  Progress: 1080 on 5638  Progress: 1081 on 5638  Progress: 1082 on 5638  Progress: 1083 on 5638  Progress: 1084 on 5638  Progress: 1085 on 5638  Progress: 1086 on 5638  Progress: 1087 on 5638  Progress: 1088 on 5638  Progress: 1089 on 5638  Progress: 1090 on 5638  Progress: 1091 on 5638  Progress: 1092 on 5638  Progress: 1093 on 5638  Progress: 1094 on 5638  Progress: 1095 on 5638  Progress: 1096 on 5638  Progress: 1097 on 5638  Progress: 1098 on 5638  Progress: 1099 on 5638  Progress: 1100 on 5638  Progress: 1101 on 5638  Progress: 1102 on 5638  Progress: 1103 on 5638  Progress: 1104 on 5638  Progress: 1105 on 5638  Progress: 1106 on 5638  Progress: 1107 on 5638  Progress: 1108 on 5638  Progress: 1109 on 5638  Progress: 1110 on 5638  Progress: 1111 on 5638  Progress: 1112 on 5638  Progress: 1113 on 5638  Progress: 1114 on 5638  Progress: 1115 on 5638  Progress: 1116 on 5638  Progress: 1117 on 5638  Progress: 1118 on 5638  Progress: 1119 on 5638  Progress: 1120 on 5638  Progress: 1121 on 5638  Progress: 1122 on 5638  Progress: 1123 on 5638  Progress: 1124 on 5638  Progress: 1125 on 5638  Progress: 1126 on 5638  Progress: 1127 on 5638  Progress: 1128 on 5638  Progress: 1129 on 5638  Progress: 1130 on 5638  Progress: 1131 on 5638  Progress: 1132 on 5638  Progress: 1133 on 5638  Progress: 1134 on 5638  Progress: 1135 on 5638  Progress: 1136 on 5638  Progress: 1137 on 5638  Progress: 1138 on 5638  Progress: 1139 on 5638  Progress: 1140 on 5638  Progress: 1141 on 5638  Progress: 1142 on 5638  Progress: 1143 on 5638  Progress: 1144 on 5638  Progress: 1145 on 5638  Progress: 1146 on 5638  Progress: 1147 on 5638  Progress: 1148 on 5638  Progress: 1149 on 5638  Progress: 1150 on 5638  Progress: 1151 on 5638  Progress: 1152 on 5638  Progress: 1153 on 5638  Progress: 1154 on 5638  Progress: 1155 on 5638  Progress: 1156 on 5638  Progress: 1157 on 5638  Progress: 1158 on 5638  Progress: 1159 on 5638  Progress: 1160 on 5638  Progress: 1161 on 5638  Progress: 1162 on 5638  Progress: 1163 on 5638  Progress: 1164 on 5638  Progress: 1165 on 5638  Progress: 1166 on 5638  Progress: 1167 on 5638  Progress: 1168 on 5638  Progress: 1169 on 5638  Progress: 1170 on 5638  Progress: 1171 on 5638  Progress: 1172 on 5638  Progress: 1173 on 5638  Progress: 1174 on 5638  Progress: 1175 on 5638  Progress: 1176 on 5638  Progress: 1177 on 5638  Progress: 1178 on 5638  Progress: 1179 on 5638  Progress: 1180 on 5638  Progress: 1181 on 5638  Progress: 1182 on 5638  Progress: 1183 on 5638  Progress: 1184 on 5638  Progress: 1185 on 5638  Progress: 1186 on 5638  Progress: 1187 on 5638  Progress: 1188 on 5638  Progress: 1189 on 5638  Progress: 1190 on 5638  Progress: 1191 on 5638  Progress: 1192 on 5638  Progress: 1193 on 5638  Progress: 1194 on 5638  Progress: 1195 on 5638  Progress: 1196 on 5638  Progress: 1197 on 5638  Progress: 1198 on 5638  Progress: 1199 on 5638  Progress: 1200 on 5638  Progress: 1201 on 5638  Progress: 1202 on 5638  Progress: 1203 on 5638  Progress: 1204 on 5638  Progress: 1205 on 5638  Progress: 1206 on 5638  Progress: 1207 on 5638  Progress: 1208 on 5638  Progress: 1209 on 5638  Progress: 1210 on 5638  Progress: 1211 on 5638  Progress: 1212 on 5638  Progress: 1213 on 5638  Progress: 1214 on 5638  Progress: 1215 on 5638  Progress: 1216 on 5638  Progress: 1217 on 5638  Progress: 1218 on 5638  Progress: 1219 on 5638  Progress: 1220 on 5638  Progress: 1221 on 5638  Progress: 1222 on 5638  Progress: 1223 on 5638  Progress: 1224 on 5638  Progress: 1225 on 5638  Progress: 1226 on 5638  Progress: 1227 on 5638  Progress: 1228 on 5638  Progress: 1229 on 5638  Progress: 1230 on 5638  Progress: 1231 on 5638  Progress: 1232 on 5638  Progress: 1233 on 5638  Progress: 1234 on 5638  Progress: 1235 on 5638  Progress: 1236 on 5638  Progress: 1237 on 5638  Progress: 1238 on 5638  Progress: 1239 on 5638  Progress: 1240 on 5638  Progress: 1241 on 5638  Progress: 1242 on 5638  Progress: 1243 on 5638  Progress: 1244 on 5638  Progress: 1245 on 5638  Progress: 1246 on 5638  Progress: 1247 on 5638  Progress: 1248 on 5638  Progress: 1249 on 5638  Progress: 1250 on 5638  Progress: 1251 on 5638  Progress: 1252 on 5638  Progress: 1253 on 5638  Progress: 1254 on 5638  Progress: 1255 on 5638  Progress: 1256 on 5638  Progress: 1257 on 5638  Progress: 1258 on 5638  Progress: 1259 on 5638  Progress: 1260 on 5638  Progress: 1261 on 5638  Progress: 1262 on 5638  Progress: 1263 on 5638  Progress: 1264 on 5638  Progress: 1265 on 5638  Progress: 1266 on 5638  Progress: 1267 on 5638  Progress: 1268 on 5638  Progress: 1269 on 5638  Progress: 1270 on 5638  Progress: 1271 on 5638  Progress: 1272 on 5638  Progress: 1273 on 5638  Progress: 1274 on 5638  Progress: 1275 on 5638  Progress: 1276 on 5638  Progress: 1277 on 5638  Progress: 1278 on 5638  Progress: 1279 on 5638  Progress: 1280 on 5638  Progress: 1281 on 5638  Progress: 1282 on 5638  Progress: 1283 on 5638  Progress: 1284 on 5638  Progress: 1285 on 5638  Progress: 1286 on 5638  Progress: 1287 on 5638  Progress: 1288 on 5638  Progress: 1289 on 5638  Progress: 1290 on 5638  Progress: 1291 on 5638  Progress: 1292 on 5638  Progress: 1293 on 5638  Progress: 1294 on 5638  Progress: 1295 on 5638  Progress: 1296 on 5638  Progress: 1297 on 5638  Progress: 1298 on 5638  Progress: 1299 on 5638  Progress: 1300 on 5638  Progress: 1301 on 5638  Progress: 1302 on 5638  Progress: 1303 on 5638  Progress: 1304 on 5638  Progress: 1305 on 5638  Progress: 1306 on 5638  Progress: 1307 on 5638  Progress: 1308 on 5638  Progress: 1309 on 5638  Progress: 1310 on 5638  Progress: 1311 on 5638  Progress: 1312 on 5638  Progress: 1313 on 5638  Progress: 1314 on 5638  Progress: 1315 on 5638  Progress: 1316 on 5638  Progress: 1317 on 5638  Progress: 1318 on 5638  Progress: 1319 on 5638  Progress: 1320 on 5638  Progress: 1321 on 5638  Progress: 1322 on 5638  Progress: 1323 on 5638  Progress: 1324 on 5638  Progress: 1325 on 5638  Progress: 1326 on 5638  Progress: 1327 on 5638  Progress: 1328 on 5638  Progress: 1329 on 5638  Progress: 1330 on 5638  Progress: 1331 on 5638  Progress: 1332 on 5638  Progress: 1333 on 5638  Progress: 1334 on 5638  Progress: 1335 on 5638  Progress: 1336 on 5638  Progress: 1337 on 5638  Progress: 1338 on 5638  Progress: 1339 on 5638  Progress: 1340 on 5638  Progress: 1341 on 5638  Progress: 1342 on 5638  Progress: 1343 on 5638  Progress: 1344 on 5638  Progress: 1345 on 5638  Progress: 1346 on 5638  Progress: 1347 on 5638  Progress: 1348 on 5638  Progress: 1349 on 5638  Progress: 1350 on 5638  Progress: 1351 on 5638  Progress: 1352 on 5638  Progress: 1353 on 5638  Progress: 1354 on 5638  Progress: 1355 on 5638  Progress: 1356 on 5638  Progress: 1357 on 5638  Progress: 1358 on 5638  Progress: 1359 on 5638  Progress: 1360 on 5638  Progress: 1361 on 5638  Progress: 1362 on 5638  Progress: 1363 on 5638  Progress: 1364 on 5638  Progress: 1365 on 5638  Progress: 1366 on 5638  Progress: 1367 on 5638  Progress: 1368 on 5638  Progress: 1369 on 5638  Progress: 1370 on 5638  Progress: 1371 on 5638  Progress: 1372 on 5638  Progress: 1373 on 5638  Progress: 1374 on 5638  Progress: 1375 on 5638  Progress: 1376 on 5638  Progress: 1377 on 5638  Progress: 1378 on 5638  Progress: 1379 on 5638  Progress: 1380 on 5638  Progress: 1381 on 5638  Progress: 1382 on 5638  Progress: 1383 on 5638  Progress: 1384 on 5638  Progress: 1385 on 5638  Progress: 1386 on 5638  Progress: 1387 on 5638  Progress: 1388 on 5638  Progress: 1389 on 5638  Progress: 1390 on 5638  Progress: 1391 on 5638  Progress: 1392 on 5638  Progress: 1393 on 5638  Progress: 1394 on 5638  Progress: 1395 on 5638  Progress: 1396 on 5638  Progress: 1397 on 5638  Progress: 1398 on 5638  Progress: 1399 on 5638  Progress: 1400 on 5638  Progress: 1401 on 5638  Progress: 1402 on 5638  Progress: 1403 on 5638  Progress: 1404 on 5638  Progress: 1405 on 5638  Progress: 1406 on 5638  Progress: 1407 on 5638  Progress: 1408 on 5638  Progress: 1409 on 5638  Progress: 1410 on 5638  Progress: 1411 on 5638  Progress: 1412 on 5638  Progress: 1413 on 5638  Progress: 1414 on 5638  Progress: 1415 on 5638  Progress: 1416 on 5638  Progress: 1417 on 5638  Progress: 1418 on 5638  Progress: 1419 on 5638  Progress: 1420 on 5638  Progress: 1421 on 5638  Progress: 1422 on 5638  Progress: 1423 on 5638  Progress: 1424 on 5638  Progress: 1425 on 5638  Progress: 1426 on 5638  Progress: 1427 on 5638  Progress: 1428 on 5638  Progress: 1429 on 5638  Progress: 1430 on 5638  Progress: 1431 on 5638  Progress: 1432 on 5638  Progress: 1433 on 5638  Progress: 1434 on 5638  Progress: 1435 on 5638  Progress: 1436 on 5638  Progress: 1437 on 5638  Progress: 1438 on 5638  Progress: 1439 on 5638  Progress: 1440 on 5638  Progress: 1441 on 5638  Progress: 1442 on 5638  Progress: 1443 on 5638  Progress: 1444 on 5638  Progress: 1445 on 5638  Progress: 1446 on 5638  Progress: 1447 on 5638  Progress: 1448 on 5638  Progress: 1449 on 5638  Progress: 1450 on 5638  Progress: 1451 on 5638  Progress: 1452 on 5638  Progress: 1453 on 5638  Progress: 1454 on 5638  Progress: 1455 on 5638  Progress: 1456 on 5638  Progress: 1457 on 5638  Progress: 1458 on 5638  Progress: 1459 on 5638  Progress: 1460 on 5638  Progress: 1461 on 5638  Progress: 1462 on 5638  Progress: 1463 on 5638  Progress: 1464 on 5638  Progress: 1465 on 5638  Progress: 1466 on 5638  Progress: 1467 on 5638  Progress: 1468 on 5638  Progress: 1469 on 5638  Progress: 1470 on 5638  Progress: 1471 on 5638  Progress: 1472 on 5638  Progress: 1473 on 5638  Progress: 1474 on 5638  Progress: 1475 on 5638  Progress: 1476 on 5638  Progress: 1477 on 5638  Progress: 1478 on 5638  Progress: 1479 on 5638  Progress: 1480 on 5638  Progress: 1481 on 5638  Progress: 1482 on 5638  Progress: 1483 on 5638  Progress: 1484 on 5638  Progress: 1485 on 5638  Progress: 1486 on 5638  Progress: 1487 on 5638  Progress: 1488 on 5638  Progress: 1489 on 5638  Progress: 1490 on 5638  Progress: 1491 on 5638  Progress: 1492 on 5638  Progress: 1493 on 5638  Progress: 1494 on 5638  Progress: 1495 on 5638  Progress: 1496 on 5638  Progress: 1497 on 5638  Progress: 1498 on 5638  Progress: 1499 on 5638  Progress: 1500 on 5638  Progress: 1501 on 5638  Progress: 1502 on 5638  Progress: 1503 on 5638  Progress: 1504 on 5638  Progress: 1505 on 5638  Progress: 1506 on 5638  Progress: 1507 on 5638  Progress: 1508 on 5638  Progress: 1509 on 5638  Progress: 1510 on 5638  Progress: 1511 on 5638  Progress: 1512 on 5638  Progress: 1513 on 5638  Progress: 1514 on 5638  Progress: 1515 on 5638  Progress: 1516 on 5638  Progress: 1517 on 5638  Progress: 1518 on 5638  Progress: 1519 on 5638  Progress: 1520 on 5638  Progress: 1521 on 5638  Progress: 1522 on 5638  Progress: 1523 on 5638  Progress: 1524 on 5638  Progress: 1525 on 5638  Progress: 1526 on 5638  Progress: 1527 on 5638  Progress: 1528 on 5638  Progress: 1529 on 5638  Progress: 1530 on 5638  Progress: 1531 on 5638  Progress: 1532 on 5638  Progress: 1533 on 5638  Progress: 1534 on 5638  Progress: 1535 on 5638  Progress: 1536 on 5638  Progress: 1537 on 5638  Progress: 1538 on 5638  Progress: 1539 on 5638  Progress: 1540 on 5638  Progress: 1541 on 5638  Progress: 1542 on 5638  Progress: 1543 on 5638  Progress: 1544 on 5638  Progress: 1545 on 5638  Progress: 1546 on 5638  Progress: 1547 on 5638  Progress: 1548 on 5638  Progress: 1549 on 5638  Progress: 1550 on 5638  Progress: 1551 on 5638  Progress: 1552 on 5638  Progress: 1553 on 5638  Progress: 1554 on 5638  Progress: 1555 on 5638  Progress: 1556 on 5638  Progress: 1557 on 5638  Progress: 1558 on 5638  Progress: 1559 on 5638  Progress: 1560 on 5638  Progress: 1561 on 5638  Progress: 1562 on 5638  Progress: 1563 on 5638  Progress: 1564 on 5638  Progress: 1565 on 5638  Progress: 1566 on 5638  Progress: 1567 on 5638  Progress: 1568 on 5638  Progress: 1569 on 5638  Progress: 1570 on 5638  Progress: 1571 on 5638  Progress: 1572 on 5638  Progress: 1573 on 5638  Progress: 1574 on 5638  Progress: 1575 on 5638  Progress: 1576 on 5638  Progress: 1577 on 5638  Progress: 1578 on 5638  Progress: 1579 on 5638  Progress: 1580 on 5638  Progress: 1581 on 5638  Progress: 1582 on 5638  Progress: 1583 on 5638  Progress: 1584 on 5638  Progress: 1585 on 5638  Progress: 1586 on 5638  Progress: 1587 on 5638  Progress: 1588 on 5638  Progress: 1589 on 5638  Progress: 1590 on 5638  Progress: 1591 on 5638  Progress: 1592 on 5638  Progress: 1593 on 5638  Progress: 1594 on 5638  Progress: 1595 on 5638  Progress: 1596 on 5638  Progress: 1597 on 5638  Progress: 1598 on 5638  Progress: 1599 on 5638  Progress: 1600 on 5638  Progress: 1601 on 5638  Progress: 1602 on 5638  Progress: 1603 on 5638  Progress: 1604 on 5638  Progress: 1605 on 5638  Progress: 1606 on 5638  Progress: 1607 on 5638  Progress: 1608 on 5638  Progress: 1609 on 5638  Progress: 1610 on 5638  Progress: 1611 on 5638  Progress: 1612 on 5638  Progress: 1613 on 5638  Progress: 1614 on 5638  Progress: 1615 on 5638  Progress: 1616 on 5638  Progress: 1617 on 5638  Progress: 1618 on 5638  Progress: 1619 on 5638  Progress: 1620 on 5638  Progress: 1621 on 5638  Progress: 1622 on 5638  Progress: 1623 on 5638  Progress: 1624 on 5638  Progress: 1625 on 5638  Progress: 1626 on 5638  Progress: 1627 on 5638  Progress: 1628 on 5638  Progress: 1629 on 5638  Progress: 1630 on 5638  Progress: 1631 on 5638  Progress: 1632 on 5638  Progress: 1633 on 5638  Progress: 1634 on 5638  Progress: 1635 on 5638  Progress: 1636 on 5638  Progress: 1637 on 5638  Progress: 1638 on 5638  Progress: 1639 on 5638  Progress: 1640 on 5638  Progress: 1641 on 5638  Progress: 1642 on 5638  Progress: 1643 on 5638  Progress: 1644 on 5638  Progress: 1645 on 5638  Progress: 1646 on 5638  Progress: 1647 on 5638  Progress: 1648 on 5638  Progress: 1649 on 5638  Progress: 1650 on 5638  Progress: 1651 on 5638  Progress: 1652 on 5638  Progress: 1653 on 5638  Progress: 1654 on 5638  Progress: 1655 on 5638  Progress: 1656 on 5638  Progress: 1657 on 5638  Progress: 1658 on 5638  Progress: 1659 on 5638  Progress: 1660 on 5638  Progress: 1661 on 5638  Progress: 1662 on 5638  Progress: 1663 on 5638  Progress: 1664 on 5638  Progress: 1665 on 5638  Progress: 1666 on 5638  Progress: 1667 on 5638  Progress: 1668 on 5638  Progress: 1669 on 5638  Progress: 1670 on 5638  Progress: 1671 on 5638  Progress: 1672 on 5638  Progress: 1673 on 5638  Progress: 1674 on 5638  Progress: 1675 on 5638  Progress: 1676 on 5638  Progress: 1677 on 5638  Progress: 1678 on 5638  Progress: 1679 on 5638  Progress: 1680 on 5638  Progress: 1681 on 5638  Progress: 1682 on 5638  Progress: 1683 on 5638  Progress: 1684 on 5638  Progress: 1685 on 5638  Progress: 1686 on 5638  Progress: 1687 on 5638  Progress: 1688 on 5638  Progress: 1689 on 5638  Progress: 1690 on 5638  Progress: 1691 on 5638  Progress: 1692 on 5638  Progress: 1693 on 5638  Progress: 1694 on 5638  Progress: 1695 on 5638  Progress: 1696 on 5638  Progress: 1697 on 5638  Progress: 1698 on 5638  Progress: 1699 on 5638  Progress: 1700 on 5638  Progress: 1701 on 5638  Progress: 1702 on 5638  Progress: 1703 on 5638  Progress: 1704 on 5638  Progress: 1705 on 5638  Progress: 1706 on 5638  Progress: 1707 on 5638  Progress: 1708 on 5638  Progress: 1709 on 5638  Progress: 1710 on 5638  Progress: 1711 on 5638  Progress: 1712 on 5638  Progress: 1713 on 5638  Progress: 1714 on 5638  Progress: 1715 on 5638  Progress: 1716 on 5638  Progress: 1717 on 5638  Progress: 1718 on 5638  Progress: 1719 on 5638  Progress: 1720 on 5638  Progress: 1721 on 5638  Progress: 1722 on 5638  Progress: 1723 on 5638  Progress: 1724 on 5638  Progress: 1725 on 5638  Progress: 1726 on 5638  Progress: 1727 on 5638  Progress: 1728 on 5638  Progress: 1729 on 5638  Progress: 1730 on 5638  Progress: 1731 on 5638  Progress: 1732 on 5638  Progress: 1733 on 5638  Progress: 1734 on 5638  Progress: 1735 on 5638  Progress: 1736 on 5638  Progress: 1737 on 5638  Progress: 1738 on 5638  Progress: 1739 on 5638  Progress: 1740 on 5638  Progress: 1741 on 5638  Progress: 1742 on 5638  Progress: 1743 on 5638  Progress: 1744 on 5638  Progress: 1745 on 5638  Progress: 1746 on 5638  Progress: 1747 on 5638  Progress: 1748 on 5638  Progress: 1749 on 5638  Progress: 1750 on 5638  Progress: 1751 on 5638  Progress: 1752 on 5638  Progress: 1753 on 5638  Progress: 1754 on 5638  Progress: 1755 on 5638  Progress: 1756 on 5638  Progress: 1757 on 5638  Progress: 1758 on 5638  Progress: 1759 on 5638  Progress: 1760 on 5638  Progress: 1761 on 5638  Progress: 1762 on 5638  Progress: 1763 on 5638  Progress: 1764 on 5638  Progress: 1765 on 5638  Progress: 1766 on 5638  Progress: 1767 on 5638  Progress: 1768 on 5638  Progress: 1769 on 5638  Progress: 1770 on 5638  Progress: 1771 on 5638  Progress: 1772 on 5638  Progress: 1773 on 5638  Progress: 1774 on 5638  Progress: 1775 on 5638  Progress: 1776 on 5638  Progress: 1777 on 5638  Progress: 1778 on 5638  Progress: 1779 on 5638  Progress: 1780 on 5638  Progress: 1781 on 5638  Progress: 1782 on 5638  Progress: 1783 on 5638  Progress: 1784 on 5638  Progress: 1785 on 5638  Progress: 1786 on 5638  Progress: 1787 on 5638  Progress: 1788 on 5638  Progress: 1789 on 5638  Progress: 1790 on 5638  Progress: 1791 on 5638  Progress: 1792 on 5638  Progress: 1793 on 5638  Progress: 1794 on 5638  Progress: 1795 on 5638  Progress: 1796 on 5638  Progress: 1797 on 5638  Progress: 1798 on 5638  Progress: 1799 on 5638  Progress: 1800 on 5638  Progress: 1801 on 5638  Progress: 1802 on 5638  Progress: 1803 on 5638  Progress: 1804 on 5638  Progress: 1805 on 5638  Progress: 1806 on 5638  Progress: 1807 on 5638  Progress: 1808 on 5638  Progress: 1809 on 5638  Progress: 1810 on 5638  Progress: 1811 on 5638  Progress: 1812 on 5638  Progress: 1813 on 5638  Progress: 1814 on 5638  Progress: 1815 on 5638  Progress: 1816 on 5638  Progress: 1817 on 5638  Progress: 1818 on 5638  Progress: 1819 on 5638  Progress: 1820 on 5638  Progress: 1821 on 5638  Progress: 1822 on 5638  Progress: 1823 on 5638  Progress: 1824 on 5638  Progress: 1825 on 5638  Progress: 1826 on 5638  Progress: 1827 on 5638  Progress: 1828 on 5638  Progress: 1829 on 5638  Progress: 1830 on 5638  Progress: 1831 on 5638  Progress: 1832 on 5638  Progress: 1833 on 5638  Progress: 1834 on 5638  Progress: 1835 on 5638  Progress: 1836 on 5638  Progress: 1837 on 5638  Progress: 1838 on 5638  Progress: 1839 on 5638  Progress: 1840 on 5638  Progress: 1841 on 5638  Progress: 1842 on 5638  Progress: 1843 on 5638  Progress: 1844 on 5638  Progress: 1845 on 5638  Progress: 1846 on 5638  Progress: 1847 on 5638  Progress: 1848 on 5638  Progress: 1849 on 5638  Progress: 1850 on 5638  Progress: 1851 on 5638  Progress: 1852 on 5638  Progress: 1853 on 5638  Progress: 1854 on 5638  Progress: 1855 on 5638  Progress: 1856 on 5638  Progress: 1857 on 5638  Progress: 1858 on 5638  Progress: 1859 on 5638  Progress: 1860 on 5638  Progress: 1861 on 5638  Progress: 1862 on 5638  Progress: 1863 on 5638  Progress: 1864 on 5638  Progress: 1865 on 5638  Progress: 1866 on 5638  Progress: 1867 on 5638  Progress: 1868 on 5638  Progress: 1869 on 5638  Progress: 1870 on 5638  Progress: 1871 on 5638  Progress: 1872 on 5638  Progress: 1873 on 5638  Progress: 1874 on 5638  Progress: 1875 on 5638  Progress: 1876 on 5638  Progress: 1877 on 5638  Progress: 1878 on 5638  Progress: 1879 on 5638  Progress: 1880 on 5638  Progress: 1881 on 5638  Progress: 1882 on 5638  Progress: 1883 on 5638  Progress: 1884 on 5638  Progress: 1885 on 5638  Progress: 1886 on 5638  Progress: 1887 on 5638  Progress: 1888 on 5638  Progress: 1889 on 5638  Progress: 1890 on 5638  Progress: 1891 on 5638  Progress: 1892 on 5638  Progress: 1893 on 5638  Progress: 1894 on 5638  Progress: 1895 on 5638  Progress: 1896 on 5638  Progress: 1897 on 5638  Progress: 1898 on 5638  Progress: 1899 on 5638  Progress: 1900 on 5638  Progress: 1901 on 5638  Progress: 1902 on 5638  Progress: 1903 on 5638  Progress: 1904 on 5638  Progress: 1905 on 5638  Progress: 1906 on 5638  Progress: 1907 on 5638  Progress: 1908 on 5638  Progress: 1909 on 5638  Progress: 1910 on 5638  Progress: 1911 on 5638  Progress: 1912 on 5638  Progress: 1913 on 5638  Progress: 1914 on 5638  Progress: 1915 on 5638  Progress: 1916 on 5638  Progress: 1917 on 5638  Progress: 1918 on 5638  Progress: 1919 on 5638  Progress: 1920 on 5638  Progress: 1921 on 5638  Progress: 1922 on 5638  Progress: 1923 on 5638  Progress: 1924 on 5638  Progress: 1925 on 5638  Progress: 1926 on 5638  Progress: 1927 on 5638  Progress: 1928 on 5638  Progress: 1929 on 5638  Progress: 1930 on 5638  Progress: 1931 on 5638  Progress: 1932 on 5638  Progress: 1933 on 5638  Progress: 1934 on 5638  Progress: 1935 on 5638  Progress: 1936 on 5638  Progress: 1937 on 5638  Progress: 1938 on 5638  Progress: 1939 on 5638  Progress: 1940 on 5638  Progress: 1941 on 5638  Progress: 1942 on 5638  Progress: 1943 on 5638  Progress: 1944 on 5638  Progress: 1945 on 5638  Progress: 1946 on 5638  Progress: 1947 on 5638  Progress: 1948 on 5638  Progress: 1949 on 5638  Progress: 1950 on 5638  Progress: 1951 on 5638  Progress: 1952 on 5638  Progress: 1953 on 5638  Progress: 1954 on 5638  Progress: 1955 on 5638  Progress: 1956 on 5638  Progress: 1957 on 5638  Progress: 1958 on 5638  Progress: 1959 on 5638  Progress: 1960 on 5638  Progress: 1961 on 5638  Progress: 1962 on 5638  Progress: 1963 on 5638  Progress: 1964 on 5638  Progress: 1965 on 5638  Progress: 1966 on 5638  Progress: 1967 on 5638  Progress: 1968 on 5638  Progress: 1969 on 5638  Progress: 1970 on 5638  Progress: 1971 on 5638  Progress: 1972 on 5638  Progress: 1973 on 5638  Progress: 1974 on 5638  Progress: 1975 on 5638  Progress: 1976 on 5638  Progress: 1977 on 5638  Progress: 1978 on 5638  Progress: 1979 on 5638  Progress: 1980 on 5638  Progress: 1981 on 5638  Progress: 1982 on 5638  Progress: 1983 on 5638  Progress: 1984 on 5638  Progress: 1985 on 5638  Progress: 1986 on 5638  Progress: 1987 on 5638  Progress: 1988 on 5638  Progress: 1989 on 5638  Progress: 1990 on 5638  Progress: 1991 on 5638  Progress: 1992 on 5638  Progress: 1993 on 5638  Progress: 1994 on 5638  Progress: 1995 on 5638  Progress: 1996 on 5638  Progress: 1997 on 5638  Progress: 1998 on 5638  Progress: 1999 on 5638  Progress: 2000 on 5638  Progress: 2001 on 5638  Progress: 2002 on 5638  Progress: 2003 on 5638  Progress: 2004 on 5638  Progress: 2005 on 5638  Progress: 2006 on 5638  Progress: 2007 on 5638  Progress: 2008 on 5638  Progress: 2009 on 5638  Progress: 2010 on 5638  Progress: 2011 on 5638  Progress: 2012 on 5638  Progress: 2013 on 5638  Progress: 2014 on 5638  Progress: 2015 on 5638  Progress: 2016 on 5638  Progress: 2017 on 5638  Progress: 2018 on 5638  Progress: 2019 on 5638  Progress: 2020 on 5638  Progress: 2021 on 5638  Progress: 2022 on 5638  Progress: 2023 on 5638  Progress: 2024 on 5638  Progress: 2025 on 5638  Progress: 2026 on 5638  Progress: 2027 on 5638  Progress: 2028 on 5638  Progress: 2029 on 5638  Progress: 2030 on 5638  Progress: 2031 on 5638  Progress: 2032 on 5638  Progress: 2033 on 5638  Progress: 2034 on 5638  Progress: 2035 on 5638  Progress: 2036 on 5638  Progress: 2037 on 5638  Progress: 2038 on 5638  Progress: 2039 on 5638  Progress: 2040 on 5638  Progress: 2041 on 5638  Progress: 2042 on 5638  Progress: 2043 on 5638  Progress: 2044 on 5638  Progress: 2045 on 5638  Progress: 2046 on 5638  Progress: 2047 on 5638  Progress: 2048 on 5638  Progress: 2049 on 5638  Progress: 2050 on 5638  Progress: 2051 on 5638  Progress: 2052 on 5638  Progress: 2053 on 5638  Progress: 2054 on 5638  Progress: 2055 on 5638  Progress: 2056 on 5638  Progress: 2057 on 5638  Progress: 2058 on 5638  Progress: 2059 on 5638  Progress: 2060 on 5638  Progress: 2061 on 5638  Progress: 2062 on 5638  Progress: 2063 on 5638  Progress: 2064 on 5638  Progress: 2065 on 5638  Progress: 2066 on 5638  Progress: 2067 on 5638  Progress: 2068 on 5638  Progress: 2069 on 5638  Progress: 2070 on 5638  Progress: 2071 on 5638  Progress: 2072 on 5638  Progress: 2073 on 5638  Progress: 2074 on 5638  Progress: 2075 on 5638  Progress: 2076 on 5638  Progress: 2077 on 5638  Progress: 2078 on 5638  Progress: 2079 on 5638  Progress: 2080 on 5638  Progress: 2081 on 5638  Progress: 2082 on 5638  Progress: 2083 on 5638  Progress: 2084 on 5638  Progress: 2085 on 5638  Progress: 2086 on 5638  Progress: 2087 on 5638  Progress: 2088 on 5638  Progress: 2089 on 5638  Progress: 2090 on 5638  Progress: 2091 on 5638  Progress: 2092 on 5638  Progress: 2093 on 5638  Progress: 2094 on 5638  Progress: 2095 on 5638  Progress: 2096 on 5638  Progress: 2097 on 5638  Progress: 2098 on 5638  Progress: 2099 on 5638  Progress: 2100 on 5638  Progress: 2101 on 5638  Progress: 2102 on 5638  Progress: 2103 on 5638  Progress: 2104 on 5638  Progress: 2105 on 5638  Progress: 2106 on 5638  Progress: 2107 on 5638  Progress: 2108 on 5638  Progress: 2109 on 5638  Progress: 2110 on 5638  Progress: 2111 on 5638  Progress: 2112 on 5638  Progress: 2113 on 5638  Progress: 2114 on 5638  Progress: 2115 on 5638  Progress: 2116 on 5638  Progress: 2117 on 5638  Progress: 2118 on 5638  Progress: 2119 on 5638  Progress: 2120 on 5638  Progress: 2121 on 5638  Progress: 2122 on 5638  Progress: 2123 on 5638  Progress: 2124 on 5638  Progress: 2125 on 5638  Progress: 2126 on 5638  Progress: 2127 on 5638  Progress: 2128 on 5638  Progress: 2129 on 5638  Progress: 2130 on 5638  Progress: 2131 on 5638  Progress: 2132 on 5638  Progress: 2133 on 5638  Progress: 2134 on 5638  Progress: 2135 on 5638  Progress: 2136 on 5638  Progress: 2137 on 5638  Progress: 2138 on 5638  Progress: 2139 on 5638  Progress: 2140 on 5638  Progress: 2141 on 5638  Progress: 2142 on 5638  Progress: 2143 on 5638  Progress: 2144 on 5638  Progress: 2145 on 5638  Progress: 2146 on 5638  Progress: 2147 on 5638  Progress: 2148 on 5638  Progress: 2149 on 5638  Progress: 2150 on 5638  Progress: 2151 on 5638  Progress: 2152 on 5638  Progress: 2153 on 5638  Progress: 2154 on 5638  Progress: 2155 on 5638  Progress: 2156 on 5638  Progress: 2157 on 5638  Progress: 2158 on 5638  Progress: 2159 on 5638  Progress: 2160 on 5638  Progress: 2161 on 5638  Progress: 2162 on 5638  Progress: 2163 on 5638  Progress: 2164 on 5638  Progress: 2165 on 5638  Progress: 2166 on 5638  Progress: 2167 on 5638  Progress: 2168 on 5638  Progress: 2169 on 5638  Progress: 2170 on 5638  Progress: 2171 on 5638  Progress: 2172 on 5638  Progress: 2173 on 5638  Progress: 2174 on 5638  Progress: 2175 on 5638  Progress: 2176 on 5638  Progress: 2177 on 5638  Progress: 2178 on 5638  Progress: 2179 on 5638  Progress: 2180 on 5638  Progress: 2181 on 5638  Progress: 2182 on 5638  Progress: 2183 on 5638  Progress: 2184 on 5638  Progress: 2185 on 5638  Progress: 2186 on 5638  Progress: 2187 on 5638  Progress: 2188 on 5638  Progress: 2189 on 5638  Progress: 2190 on 5638  Progress: 2191 on 5638  Progress: 2192 on 5638  Progress: 2193 on 5638  Progress: 2194 on 5638  Progress: 2195 on 5638  Progress: 2196 on 5638  Progress: 2197 on 5638  Progress: 2198 on 5638  Progress: 2199 on 5638  Progress: 2200 on 5638  Progress: 2201 on 5638  Progress: 2202 on 5638  Progress: 2203 on 5638  Progress: 2204 on 5638  Progress: 2205 on 5638  Progress: 2206 on 5638  Progress: 2207 on 5638  Progress: 2208 on 5638  Progress: 2209 on 5638  Progress: 2210 on 5638  Progress: 2211 on 5638  Progress: 2212 on 5638  Progress: 2213 on 5638  Progress: 2214 on 5638  Progress: 2215 on 5638  Progress: 2216 on 5638  Progress: 2217 on 5638  Progress: 2218 on 5638  Progress: 2219 on 5638  Progress: 2220 on 5638  Progress: 2221 on 5638  Progress: 2222 on 5638  Progress: 2223 on 5638  Progress: 2224 on 5638  Progress: 2225 on 5638  Progress: 2226 on 5638  Progress: 2227 on 5638  Progress: 2228 on 5638  Progress: 2229 on 5638  Progress: 2230 on 5638  Progress: 2231 on 5638  Progress: 2232 on 5638  Progress: 2233 on 5638  Progress: 2234 on 5638  Progress: 2235 on 5638  Progress: 2236 on 5638  Progress: 2237 on 5638  Progress: 2238 on 5638  Progress: 2239 on 5638  Progress: 2240 on 5638  Progress: 2241 on 5638  Progress: 2242 on 5638  Progress: 2243 on 5638  Progress: 2244 on 5638  Progress: 2245 on 5638  Progress: 2246 on 5638  Progress: 2247 on 5638  Progress: 2248 on 5638  Progress: 2249 on 5638  Progress: 2250 on 5638  Progress: 2251 on 5638  Progress: 2252 on 5638  Progress: 2253 on 5638  Progress: 2254 on 5638  Progress: 2255 on 5638  Progress: 2256 on 5638  Progress: 2257 on 5638  Progress: 2258 on 5638  Progress: 2259 on 5638  Progress: 2260 on 5638  Progress: 2261 on 5638  Progress: 2262 on 5638  Progress: 2263 on 5638  Progress: 2264 on 5638  Progress: 2265 on 5638  Progress: 2266 on 5638  Progress: 2267 on 5638  Progress: 2268 on 5638  Progress: 2269 on 5638  Progress: 2270 on 5638  Progress: 2271 on 5638  Progress: 2272 on 5638  Progress: 2273 on 5638  Progress: 2274 on 5638  Progress: 2275 on 5638  Progress: 2276 on 5638  Progress: 2277 on 5638  Progress: 2278 on 5638  Progress: 2279 on 5638  Progress: 2280 on 5638  Progress: 2281 on 5638  Progress: 2282 on 5638  Progress: 2283 on 5638  Progress: 2284 on 5638  Progress: 2285 on 5638  Progress: 2286 on 5638  Progress: 2287 on 5638  Progress: 2288 on 5638  Progress: 2289 on 5638  Progress: 2290 on 5638  Progress: 2291 on 5638  Progress: 2292 on 5638  Progress: 2293 on 5638  Progress: 2294 on 5638  Progress: 2295 on 5638  Progress: 2296 on 5638  Progress: 2297 on 5638  Progress: 2298 on 5638  Progress: 2299 on 5638  Progress: 2300 on 5638  Progress: 2301 on 5638  Progress: 2302 on 5638  Progress: 2303 on 5638  Progress: 2304 on 5638  Progress: 2305 on 5638  Progress: 2306 on 5638  Progress: 2307 on 5638  Progress: 2308 on 5638  Progress: 2309 on 5638  Progress: 2310 on 5638  Progress: 2311 on 5638  Progress: 2312 on 5638  Progress: 2313 on 5638  Progress: 2314 on 5638  Progress: 2315 on 5638  Progress: 2316 on 5638  Progress: 2317 on 5638  Progress: 2318 on 5638  Progress: 2319 on 5638  Progress: 2320 on 5638  Progress: 2321 on 5638  Progress: 2322 on 5638  Progress: 2323 on 5638  Progress: 2324 on 5638  Progress: 2325 on 5638  Progress: 2326 on 5638  Progress: 2327 on 5638  Progress: 2328 on 5638  Progress: 2329 on 5638  Progress: 2330 on 5638  Progress: 2331 on 5638  Progress: 2332 on 5638  Progress: 2333 on 5638  Progress: 2334 on 5638  Progress: 2335 on 5638  Progress: 2336 on 5638  Progress: 2337 on 5638  Progress: 2338 on 5638  Progress: 2339 on 5638  Progress: 2340 on 5638  Progress: 2341 on 5638  Progress: 2342 on 5638  Progress: 2343 on 5638  Progress: 2344 on 5638  Progress: 2345 on 5638  Progress: 2346 on 5638  Progress: 2347 on 5638  Progress: 2348 on 5638  Progress: 2349 on 5638  Progress: 2350 on 5638  Progress: 2351 on 5638  Progress: 2352 on 5638  Progress: 2353 on 5638  Progress: 2354 on 5638  Progress: 2355 on 5638  Progress: 2356 on 5638  Progress: 2357 on 5638  Progress: 2358 on 5638  Progress: 2359 on 5638  Progress: 2360 on 5638  Progress: 2361 on 5638  Progress: 2362 on 5638  Progress: 2363 on 5638  Progress: 2364 on 5638  Progress: 2365 on 5638  Progress: 2366 on 5638  Progress: 2367 on 5638  Progress: 2368 on 5638  Progress: 2369 on 5638  Progress: 2370 on 5638  Progress: 2371 on 5638  Progress: 2372 on 5638  Progress: 2373 on 5638  Progress: 2374 on 5638  Progress: 2375 on 5638  Progress: 2376 on 5638  Progress: 2377 on 5638  Progress: 2378 on 5638  Progress: 2379 on 5638  Progress: 2380 on 5638  Progress: 2381 on 5638  Progress: 2382 on 5638  Progress: 2383 on 5638  Progress: 2384 on 5638  Progress: 2385 on 5638  Progress: 2386 on 5638  Progress: 2387 on 5638  Progress: 2388 on 5638  Progress: 2389 on 5638  Progress: 2390 on 5638  Progress: 2391 on 5638  Progress: 2392 on 5638  Progress: 2393 on 5638  Progress: 2394 on 5638  Progress: 2395 on 5638  Progress: 2396 on 5638  Progress: 2397 on 5638  Progress: 2398 on 5638  Progress: 2399 on 5638  Progress: 2400 on 5638  Progress: 2401 on 5638  Progress: 2402 on 5638  Progress: 2403 on 5638  Progress: 2404 on 5638  Progress: 2405 on 5638  Progress: 2406 on 5638  Progress: 2407 on 5638  Progress: 2408 on 5638  Progress: 2409 on 5638  Progress: 2410 on 5638  Progress: 2411 on 5638  Progress: 2412 on 5638  Progress: 2413 on 5638  Progress: 2414 on 5638  Progress: 2415 on 5638  Progress: 2416 on 5638  Progress: 2417 on 5638  Progress: 2418 on 5638  Progress: 2419 on 5638  Progress: 2420 on 5638  Progress: 2421 on 5638  Progress: 2422 on 5638  Progress: 2423 on 5638  Progress: 2424 on 5638  Progress: 2425 on 5638  Progress: 2426 on 5638  Progress: 2427 on 5638  Progress: 2428 on 5638  Progress: 2429 on 5638  Progress: 2430 on 5638  Progress: 2431 on 5638  Progress: 2432 on 5638  Progress: 2433 on 5638  Progress: 2434 on 5638  Progress: 2435 on 5638  Progress: 2436 on 5638  Progress: 2437 on 5638  Progress: 2438 on 5638  Progress: 2439 on 5638  Progress: 2440 on 5638  Progress: 2441 on 5638  Progress: 2442 on 5638  Progress: 2443 on 5638  Progress: 2444 on 5638  Progress: 2445 on 5638  Progress: 2446 on 5638  Progress: 2447 on 5638  Progress: 2448 on 5638  Progress: 2449 on 5638  Progress: 2450 on 5638  Progress: 2451 on 5638  Progress: 2452 on 5638  Progress: 2453 on 5638  Progress: 2454 on 5638  Progress: 2455 on 5638  Progress: 2456 on 5638  Progress: 2457 on 5638  Progress: 2458 on 5638  Progress: 2459 on 5638  Progress: 2460 on 5638  Progress: 2461 on 5638  Progress: 2462 on 5638  Progress: 2463 on 5638  Progress: 2464 on 5638  Progress: 2465 on 5638  Progress: 2466 on 5638  Progress: 2467 on 5638  Progress: 2468 on 5638  Progress: 2469 on 5638  Progress: 2470 on 5638  Progress: 2471 on 5638  Progress: 2472 on 5638  Progress: 2473 on 5638  Progress: 2474 on 5638  Progress: 2475 on 5638  Progress: 2476 on 5638  Progress: 2477 on 5638  Progress: 2478 on 5638  Progress: 2479 on 5638  Progress: 2480 on 5638  Progress: 2481 on 5638  Progress: 2482 on 5638  Progress: 2483 on 5638  Progress: 2484 on 5638  Progress: 2485 on 5638  Progress: 2486 on 5638  Progress: 2487 on 5638  Progress: 2488 on 5638  Progress: 2489 on 5638  Progress: 2490 on 5638  Progress: 2491 on 5638  Progress: 2492 on 5638  Progress: 2493 on 5638  Progress: 2494 on 5638  Progress: 2495 on 5638  Progress: 2496 on 5638  Progress: 2497 on 5638  Progress: 2498 on 5638  Progress: 2499 on 5638  Progress: 2500 on 5638  Progress: 2501 on 5638  Progress: 2502 on 5638  Progress: 2503 on 5638  Progress: 2504 on 5638  Progress: 2505 on 5638  Progress: 2506 on 5638  Progress: 2507 on 5638  Progress: 2508 on 5638  Progress: 2509 on 5638  Progress: 2510 on 5638  Progress: 2511 on 5638  Progress: 2512 on 5638  Progress: 2513 on 5638  Progress: 2514 on 5638  Progress: 2515 on 5638  Progress: 2516 on 5638  Progress: 2517 on 5638  Progress: 2518 on 5638  Progress: 2519 on 5638  Progress: 2520 on 5638  Progress: 2521 on 5638  Progress: 2522 on 5638  Progress: 2523 on 5638  Progress: 2524 on 5638  Progress: 2525 on 5638  Progress: 2526 on 5638  Progress: 2527 on 5638  Progress: 2528 on 5638  Progress: 2529 on 5638  Progress: 2530 on 5638  Progress: 2531 on 5638  Progress: 2532 on 5638  Progress: 2533 on 5638  Progress: 2534 on 5638  Progress: 2535 on 5638  Progress: 2536 on 5638  Progress: 2537 on 5638  Progress: 2538 on 5638  Progress: 2539 on 5638  Progress: 2540 on 5638  Progress: 2541 on 5638  Progress: 2542 on 5638  Progress: 2543 on 5638  Progress: 2544 on 5638  Progress: 2545 on 5638  Progress: 2546 on 5638  Progress: 2547 on 5638  Progress: 2548 on 5638  Progress: 2549 on 5638  Progress: 2550 on 5638  Progress: 2551 on 5638  Progress: 2552 on 5638  Progress: 2553 on 5638  Progress: 2554 on 5638  Progress: 2555 on 5638  Progress: 2556 on 5638  Progress: 2557 on 5638  Progress: 2558 on 5638  Progress: 2559 on 5638  Progress: 2560 on 5638  Progress: 2561 on 5638  Progress: 2562 on 5638  Progress: 2563 on 5638  Progress: 2564 on 5638  Progress: 2565 on 5638  Progress: 2566 on 5638  Progress: 2567 on 5638  Progress: 2568 on 5638  Progress: 2569 on 5638  Progress: 2570 on 5638  Progress: 2571 on 5638  Progress: 2572 on 5638  Progress: 2573 on 5638  Progress: 2574 on 5638  Progress: 2575 on 5638  Progress: 2576 on 5638  Progress: 2577 on 5638  Progress: 2578 on 5638  Progress: 2579 on 5638  Progress: 2580 on 5638  Progress: 2581 on 5638  Progress: 2582 on 5638  Progress: 2583 on 5638  Progress: 2584 on 5638  Progress: 2585 on 5638  Progress: 2586 on 5638  Progress: 2587 on 5638  Progress: 2588 on 5638  Progress: 2589 on 5638  Progress: 2590 on 5638  Progress: 2591 on 5638  Progress: 2592 on 5638  Progress: 2593 on 5638  Progress: 2594 on 5638  Progress: 2595 on 5638  Progress: 2596 on 5638  Progress: 2597 on 5638  Progress: 2598 on 5638  Progress: 2599 on 5638  Progress: 2600 on 5638  Progress: 2601 on 5638  Progress: 2602 on 5638  Progress: 2603 on 5638  Progress: 2604 on 5638  Progress: 2605 on 5638  Progress: 2606 on 5638  Progress: 2607 on 5638  Progress: 2608 on 5638  Progress: 2609 on 5638  Progress: 2610 on 5638  Progress: 2611 on 5638  Progress: 2612 on 5638  Progress: 2613 on 5638  Progress: 2614 on 5638  Progress: 2615 on 5638  Progress: 2616 on 5638  Progress: 2617 on 5638  Progress: 2618 on 5638  Progress: 2619 on 5638  Progress: 2620 on 5638  Progress: 2621 on 5638  Progress: 2622 on 5638  Progress: 2623 on 5638  Progress: 2624 on 5638  Progress: 2625 on 5638  Progress: 2626 on 5638  Progress: 2627 on 5638  Progress: 2628 on 5638  Progress: 2629 on 5638  Progress: 2630 on 5638  Progress: 2631 on 5638  Progress: 2632 on 5638  Progress: 2633 on 5638  Progress: 2634 on 5638  Progress: 2635 on 5638  Progress: 2636 on 5638  Progress: 2637 on 5638  Progress: 2638 on 5638  Progress: 2639 on 5638  Progress: 2640 on 5638  Progress: 2641 on 5638  Progress: 2642 on 5638  Progress: 2643 on 5638  Progress: 2644 on 5638  Progress: 2645 on 5638  Progress: 2646 on 5638  Progress: 2647 on 5638  Progress: 2648 on 5638  Progress: 2649 on 5638  Progress: 2650 on 5638  Progress: 2651 on 5638  Progress: 2652 on 5638  Progress: 2653 on 5638  Progress: 2654 on 5638  Progress: 2655 on 5638  Progress: 2656 on 5638  Progress: 2657 on 5638  Progress: 2658 on 5638  Progress: 2659 on 5638  Progress: 2660 on 5638  Progress: 2661 on 5638  Progress: 2662 on 5638  Progress: 2663 on 5638  Progress: 2664 on 5638  Progress: 2665 on 5638  Progress: 2666 on 5638  Progress: 2667 on 5638  Progress: 2668 on 5638  Progress: 2669 on 5638  Progress: 2670 on 5638  Progress: 2671 on 5638  Progress: 2672 on 5638  Progress: 2673 on 5638  Progress: 2674 on 5638  Progress: 2675 on 5638  Progress: 2676 on 5638  Progress: 2677 on 5638  Progress: 2678 on 5638  Progress: 2679 on 5638  Progress: 2680 on 5638  Progress: 2681 on 5638  Progress: 2682 on 5638  Progress: 2683 on 5638  Progress: 2684 on 5638  Progress: 2685 on 5638  Progress: 2686 on 5638  Progress: 2687 on 5638  Progress: 2688 on 5638  Progress: 2689 on 5638  Progress: 2690 on 5638  Progress: 2691 on 5638  Progress: 2692 on 5638  Progress: 2693 on 5638  Progress: 2694 on 5638  Progress: 2695 on 5638  Progress: 2696 on 5638  Progress: 2697 on 5638  Progress: 2698 on 5638  Progress: 2699 on 5638  Progress: 2700 on 5638  Progress: 2701 on 5638  Progress: 2702 on 5638  Progress: 2703 on 5638  Progress: 2704 on 5638  Progress: 2705 on 5638  Progress: 2706 on 5638  Progress: 2707 on 5638  Progress: 2708 on 5638  Progress: 2709 on 5638  Progress: 2710 on 5638  Progress: 2711 on 5638  Progress: 2712 on 5638  Progress: 2713 on 5638  Progress: 2714 on 5638  Progress: 2715 on 5638  Progress: 2716 on 5638  Progress: 2717 on 5638  Progress: 2718 on 5638  Progress: 2719 on 5638  Progress: 2720 on 5638  Progress: 2721 on 5638  Progress: 2722 on 5638  Progress: 2723 on 5638  Progress: 2724 on 5638  Progress: 2725 on 5638  Progress: 2726 on 5638  Progress: 2727 on 5638  Progress: 2728 on 5638  Progress: 2729 on 5638  Progress: 2730 on 5638  Progress: 2731 on 5638  Progress: 2732 on 5638  Progress: 2733 on 5638  Progress: 2734 on 5638  Progress: 2735 on 5638  Progress: 2736 on 5638  Progress: 2737 on 5638  Progress: 2738 on 5638  Progress: 2739 on 5638  Progress: 2740 on 5638  Progress: 2741 on 5638  Progress: 2742 on 5638  Progress: 2743 on 5638  Progress: 2744 on 5638  Progress: 2745 on 5638  Progress: 2746 on 5638  Progress: 2747 on 5638  Progress: 2748 on 5638  Progress: 2749 on 5638  Progress: 2750 on 5638  Progress: 2751 on 5638  Progress: 2752 on 5638  Progress: 2753 on 5638  Progress: 2754 on 5638  Progress: 2755 on 5638  Progress: 2756 on 5638  Progress: 2757 on 5638  Progress: 2758 on 5638  Progress: 2759 on 5638  Progress: 2760 on 5638  Progress: 2761 on 5638  Progress: 2762 on 5638  Progress: 2763 on 5638  Progress: 2764 on 5638  Progress: 2765 on 5638  Progress: 2766 on 5638  Progress: 2767 on 5638  Progress: 2768 on 5638  Progress: 2769 on 5638  Progress: 2770 on 5638  Progress: 2771 on 5638  Progress: 2772 on 5638  Progress: 2773 on 5638  Progress: 2774 on 5638  Progress: 2775 on 5638  Progress: 2776 on 5638  Progress: 2777 on 5638  Progress: 2778 on 5638  Progress: 2779 on 5638  Progress: 2780 on 5638  Progress: 2781 on 5638  Progress: 2782 on 5638  Progress: 2783 on 5638  Progress: 2784 on 5638  Progress: 2785 on 5638  Progress: 2786 on 5638  Progress: 2787 on 5638  Progress: 2788 on 5638  Progress: 2789 on 5638  Progress: 2790 on 5638  Progress: 2791 on 5638  Progress: 2792 on 5638  Progress: 2793 on 5638  Progress: 2794 on 5638  Progress: 2795 on 5638  Progress: 2796 on 5638  Progress: 2797 on 5638  Progress: 2798 on 5638  Progress: 2799 on 5638  Progress: 2800 on 5638  Progress: 2801 on 5638  Progress: 2802 on 5638  Progress: 2803 on 5638  Progress: 2804 on 5638  Progress: 2805 on 5638  Progress: 2806 on 5638  Progress: 2807 on 5638  Progress: 2808 on 5638  Progress: 2809 on 5638  Progress: 2810 on 5638  Progress: 2811 on 5638  Progress: 2812 on 5638  Progress: 2813 on 5638  Progress: 2814 on 5638  Progress: 2815 on 5638  Progress: 2816 on 5638  Progress: 2817 on 5638  Progress: 2818 on 5638  Progress: 2819 on 5638  Progress: 2820 on 5638  Progress: 2821 on 5638  Progress: 2822 on 5638  Progress: 2823 on 5638  Progress: 2824 on 5638  Progress: 2825 on 5638  Progress: 2826 on 5638  Progress: 2827 on 5638  Progress: 2828 on 5638  Progress: 2829 on 5638  Progress: 2830 on 5638  Progress: 2831 on 5638  Progress: 2832 on 5638  Progress: 2833 on 5638  Progress: 2834 on 5638  Progress: 2835 on 5638  Progress: 2836 on 5638  Progress: 2837 on 5638  Progress: 2838 on 5638  Progress: 2839 on 5638  Progress: 2840 on 5638  Progress: 2841 on 5638  Progress: 2842 on 5638  Progress: 2843 on 5638  Progress: 2844 on 5638  Progress: 2845 on 5638  Progress: 2846 on 5638  Progress: 2847 on 5638  Progress: 2848 on 5638  Progress: 2849 on 5638  Progress: 2850 on 5638  Progress: 2851 on 5638  Progress: 2852 on 5638  Progress: 2853 on 5638  Progress: 2854 on 5638  Progress: 2855 on 5638  Progress: 2856 on 5638  Progress: 2857 on 5638  Progress: 2858 on 5638  Progress: 2859 on 5638  Progress: 2860 on 5638  Progress: 2861 on 5638  Progress: 2862 on 5638  Progress: 2863 on 5638  Progress: 2864 on 5638  Progress: 2865 on 5638  Progress: 2866 on 5638  Progress: 2867 on 5638  Progress: 2868 on 5638  Progress: 2869 on 5638  Progress: 2870 on 5638  Progress: 2871 on 5638  Progress: 2872 on 5638  Progress: 2873 on 5638  Progress: 2874 on 5638  Progress: 2875 on 5638  Progress: 2876 on 5638  Progress: 2877 on 5638  Progress: 2878 on 5638  Progress: 2879 on 5638  Progress: 2880 on 5638  Progress: 2881 on 5638  Progress: 2882 on 5638  Progress: 2883 on 5638  Progress: 2884 on 5638  Progress: 2885 on 5638  Progress: 2886 on 5638  Progress: 2887 on 5638  Progress: 2888 on 5638  Progress: 2889 on 5638  Progress: 2890 on 5638  Progress: 2891 on 5638  Progress: 2892 on 5638  Progress: 2893 on 5638  Progress: 2894 on 5638  Progress: 2895 on 5638  Progress: 2896 on 5638  Progress: 2897 on 5638  Progress: 2898 on 5638  Progress: 2899 on 5638  Progress: 2900 on 5638  Progress: 2901 on 5638  Progress: 2902 on 5638  Progress: 2903 on 5638  Progress: 2904 on 5638  Progress: 2905 on 5638  Progress: 2906 on 5638  Progress: 2907 on 5638  Progress: 2908 on 5638  Progress: 2909 on 5638  Progress: 2910 on 5638  Progress: 2911 on 5638  Progress: 2912 on 5638  Progress: 2913 on 5638  Progress: 2914 on 5638  Progress: 2915 on 5638  Progress: 2916 on 5638  Progress: 2917 on 5638  Progress: 2918 on 5638  Progress: 2919 on 5638  Progress: 2920 on 5638  Progress: 2921 on 5638  Progress: 2922 on 5638  Progress: 2923 on 5638  Progress: 2924 on 5638  Progress: 2925 on 5638  Progress: 2926 on 5638  Progress: 2927 on 5638  Progress: 2928 on 5638  Progress: 2929 on 5638  Progress: 2930 on 5638  Progress: 2931 on 5638  Progress: 2932 on 5638  Progress: 2933 on 5638  Progress: 2934 on 5638  Progress: 2935 on 5638  Progress: 2936 on 5638  Progress: 2937 on 5638  Progress: 2938 on 5638  Progress: 2939 on 5638  Progress: 2940 on 5638  Progress: 2941 on 5638  Progress: 2942 on 5638  Progress: 2943 on 5638  Progress: 2944 on 5638  Progress: 2945 on 5638  Progress: 2946 on 5638  Progress: 2947 on 5638  Progress: 2948 on 5638  Progress: 2949 on 5638  Progress: 2950 on 5638  Progress: 2951 on 5638  Progress: 2952 on 5638  Progress: 2953 on 5638  Progress: 2954 on 5638  Progress: 2955 on 5638  Progress: 2956 on 5638  Progress: 2957 on 5638  Progress: 2958 on 5638  Progress: 2959 on 5638  Progress: 2960 on 5638  Progress: 2961 on 5638  Progress: 2962 on 5638  Progress: 2963 on 5638  Progress: 2964 on 5638  Progress: 2965 on 5638  Progress: 2966 on 5638  Progress: 2967 on 5638  Progress: 2968 on 5638  Progress: 2969 on 5638  Progress: 2970 on 5638  Progress: 2971 on 5638  Progress: 2972 on 5638  Progress: 2973 on 5638  Progress: 2974 on 5638  Progress: 2975 on 5638  Progress: 2976 on 5638  Progress: 2977 on 5638  Progress: 2978 on 5638  Progress: 2979 on 5638  Progress: 2980 on 5638  Progress: 2981 on 5638  Progress: 2982 on 5638  Progress: 2983 on 5638  Progress: 2984 on 5638  Progress: 2985 on 5638  Progress: 2986 on 5638  Progress: 2987 on 5638  Progress: 2988 on 5638  Progress: 2989 on 5638  Progress: 2990 on 5638  Progress: 2991 on 5638  Progress: 2992 on 5638  Progress: 2993 on 5638  Progress: 2994 on 5638  Progress: 2995 on 5638  Progress: 2996 on 5638  Progress: 2997 on 5638  Progress: 2998 on 5638  Progress: 2999 on 5638  Progress: 3000 on 5638  Progress: 3001 on 5638  Progress: 3002 on 5638  Progress: 3003 on 5638  Progress: 3004 on 5638  Progress: 3005 on 5638  Progress: 3006 on 5638  Progress: 3007 on 5638  Progress: 3008 on 5638  Progress: 3009 on 5638  Progress: 3010 on 5638  Progress: 3011 on 5638  Progress: 3012 on 5638  Progress: 3013 on 5638  Progress: 3014 on 5638  Progress: 3015 on 5638  Progress: 3016 on 5638  Progress: 3017 on 5638  Progress: 3018 on 5638  Progress: 3019 on 5638  Progress: 3020 on 5638  Progress: 3021 on 5638  Progress: 3022 on 5638  Progress: 3023 on 5638  Progress: 3024 on 5638  Progress: 3025 on 5638  Progress: 3026 on 5638  Progress: 3027 on 5638  Progress: 3028 on 5638  Progress: 3029 on 5638  Progress: 3030 on 5638  Progress: 3031 on 5638  Progress: 3032 on 5638  Progress: 3033 on 5638  Progress: 3034 on 5638  Progress: 3035 on 5638  Progress: 3036 on 5638  Progress: 3037 on 5638  Progress: 3038 on 5638  Progress: 3039 on 5638  Progress: 3040 on 5638  Progress: 3041 on 5638  Progress: 3042 on 5638  Progress: 3043 on 5638  Progress: 3044 on 5638  Progress: 3045 on 5638  Progress: 3046 on 5638  Progress: 3047 on 5638  Progress: 3048 on 5638  Progress: 3049 on 5638  Progress: 3050 on 5638  Progress: 3051 on 5638  Progress: 3052 on 5638  Progress: 3053 on 5638  Progress: 3054 on 5638  Progress: 3055 on 5638  Progress: 3056 on 5638  Progress: 3057 on 5638  Progress: 3058 on 5638  Progress: 3059 on 5638  Progress: 3060 on 5638  Progress: 3061 on 5638  Progress: 3062 on 5638  Progress: 3063 on 5638  Progress: 3064 on 5638  Progress: 3065 on 5638  Progress: 3066 on 5638  Progress: 3067 on 5638  Progress: 3068 on 5638  Progress: 3069 on 5638  Progress: 3070 on 5638  Progress: 3071 on 5638  Progress: 3072 on 5638  Progress: 3073 on 5638  Progress: 3074 on 5638  Progress: 3075 on 5638  Progress: 3076 on 5638  Progress: 3077 on 5638  Progress: 3078 on 5638  Progress: 3079 on 5638  Progress: 3080 on 5638  Progress: 3081 on 5638  Progress: 3082 on 5638  Progress: 3083 on 5638  Progress: 3084 on 5638  Progress: 3085 on 5638  Progress: 3086 on 5638  Progress: 3087 on 5638  Progress: 3088 on 5638  Progress: 3089 on 5638  Progress: 3090 on 5638  Progress: 3091 on 5638  Progress: 3092 on 5638  Progress: 3093 on 5638  Progress: 3094 on 5638  Progress: 3095 on 5638  Progress: 3096 on 5638  Progress: 3097 on 5638  Progress: 3098 on 5638  Progress: 3099 on 5638  Progress: 3100 on 5638  Progress: 3101 on 5638  Progress: 3102 on 5638  Progress: 3103 on 5638  Progress: 3104 on 5638  Progress: 3105 on 5638  Progress: 3106 on 5638  Progress: 3107 on 5638  Progress: 3108 on 5638  Progress: 3109 on 5638  Progress: 3110 on 5638  Progress: 3111 on 5638  Progress: 3112 on 5638  Progress: 3113 on 5638  Progress: 3114 on 5638  Progress: 3115 on 5638  Progress: 3116 on 5638  Progress: 3117 on 5638  Progress: 3118 on 5638  Progress: 3119 on 5638  Progress: 3120 on 5638  Progress: 3121 on 5638  Progress: 3122 on 5638  Progress: 3123 on 5638  Progress: 3124 on 5638  Progress: 3125 on 5638  Progress: 3126 on 5638  Progress: 3127 on 5638  Progress: 3128 on 5638  Progress: 3129 on 5638  Progress: 3130 on 5638  Progress: 3131 on 5638  Progress: 3132 on 5638  Progress: 3133 on 5638  Progress: 3134 on 5638  Progress: 3135 on 5638  Progress: 3136 on 5638  Progress: 3137 on 5638  Progress: 3138 on 5638  Progress: 3139 on 5638  Progress: 3140 on 5638  Progress: 3141 on 5638  Progress: 3142 on 5638  Progress: 3143 on 5638  Progress: 3144 on 5638  Progress: 3145 on 5638  Progress: 3146 on 5638  Progress: 3147 on 5638  Progress: 3148 on 5638  Progress: 3149 on 5638  Progress: 3150 on 5638  Progress: 3151 on 5638  Progress: 3152 on 5638  Progress: 3153 on 5638  Progress: 3154 on 5638  Progress: 3155 on 5638  Progress: 3156 on 5638  Progress: 3157 on 5638  Progress: 3158 on 5638  Progress: 3159 on 5638  Progress: 3160 on 5638  Progress: 3161 on 5638  Progress: 3162 on 5638  Progress: 3163 on 5638  Progress: 3164 on 5638  Progress: 3165 on 5638  Progress: 3166 on 5638  Progress: 3167 on 5638  Progress: 3168 on 5638  Progress: 3169 on 5638  Progress: 3170 on 5638  Progress: 3171 on 5638  Progress: 3172 on 5638  Progress: 3173 on 5638  Progress: 3174 on 5638  Progress: 3175 on 5638  Progress: 3176 on 5638  Progress: 3177 on 5638  Progress: 3178 on 5638  Progress: 3179 on 5638  Progress: 3180 on 5638  Progress: 3181 on 5638  Progress: 3182 on 5638  Progress: 3183 on 5638  Progress: 3184 on 5638  Progress: 3185 on 5638  Progress: 3186 on 5638  Progress: 3187 on 5638  Progress: 3188 on 5638  Progress: 3189 on 5638  Progress: 3190 on 5638  Progress: 3191 on 5638  Progress: 3192 on 5638  Progress: 3193 on 5638  Progress: 3194 on 5638  Progress: 3195 on 5638  Progress: 3196 on 5638  Progress: 3197 on 5638  Progress: 3198 on 5638  Progress: 3199 on 5638  Progress: 3200 on 5638  Progress: 3201 on 5638  Progress: 3202 on 5638  Progress: 3203 on 5638  Progress: 3204 on 5638  Progress: 3205 on 5638  Progress: 3206 on 5638  Progress: 3207 on 5638  Progress: 3208 on 5638  Progress: 3209 on 5638  Progress: 3210 on 5638  Progress: 3211 on 5638  Progress: 3212 on 5638  Progress: 3213 on 5638  Progress: 3214 on 5638  Progress: 3215 on 5638  Progress: 3216 on 5638  Progress: 3217 on 5638  Progress: 3218 on 5638  Progress: 3219 on 5638  Progress: 3220 on 5638  Progress: 3221 on 5638  Progress: 3222 on 5638  Progress: 3223 on 5638  Progress: 3224 on 5638  Progress: 3225 on 5638  Progress: 3226 on 5638  Progress: 3227 on 5638  Progress: 3228 on 5638  Progress: 3229 on 5638  Progress: 3230 on 5638  Progress: 3231 on 5638  Progress: 3232 on 5638  Progress: 3233 on 5638  Progress: 3234 on 5638  Progress: 3235 on 5638  Progress: 3236 on 5638  Progress: 3237 on 5638  Progress: 3238 on 5638  Progress: 3239 on 5638  Progress: 3240 on 5638  Progress: 3241 on 5638  Progress: 3242 on 5638  Progress: 3243 on 5638  Progress: 3244 on 5638  Progress: 3245 on 5638  Progress: 3246 on 5638  Progress: 3247 on 5638  Progress: 3248 on 5638  Progress: 3249 on 5638  Progress: 3250 on 5638  Progress: 3251 on 5638  Progress: 3252 on 5638  Progress: 3253 on 5638  Progress: 3254 on 5638  Progress: 3255 on 5638  Progress: 3256 on 5638  Progress: 3257 on 5638  Progress: 3258 on 5638  Progress: 3259 on 5638  Progress: 3260 on 5638  Progress: 3261 on 5638  Progress: 3262 on 5638  Progress: 3263 on 5638  Progress: 3264 on 5638  Progress: 3265 on 5638  Progress: 3266 on 5638  Progress: 3267 on 5638  Progress: 3268 on 5638  Progress: 3269 on 5638  Progress: 3270 on 5638  Progress: 3271 on 5638  Progress: 3272 on 5638  Progress: 3273 on 5638  Progress: 3274 on 5638  Progress: 3275 on 5638  Progress: 3276 on 5638  Progress: 3277 on 5638  Progress: 3278 on 5638  Progress: 3279 on 5638  Progress: 3280 on 5638  Progress: 3281 on 5638  Progress: 3282 on 5638  Progress: 3283 on 5638  Progress: 3284 on 5638  Progress: 3285 on 5638  Progress: 3286 on 5638  Progress: 3287 on 5638  Progress: 3288 on 5638  Progress: 3289 on 5638  Progress: 3290 on 5638  Progress: 3291 on 5638  Progress: 3292 on 5638  Progress: 3293 on 5638  Progress: 3294 on 5638  Progress: 3295 on 5638  Progress: 3296 on 5638  Progress: 3297 on 5638  Progress: 3298 on 5638  Progress: 3299 on 5638  Progress: 3300 on 5638  Progress: 3301 on 5638  Progress: 3302 on 5638  Progress: 3303 on 5638  Progress: 3304 on 5638  Progress: 3305 on 5638  Progress: 3306 on 5638  Progress: 3307 on 5638  Progress: 3308 on 5638  Progress: 3309 on 5638  Progress: 3310 on 5638  Progress: 3311 on 5638  Progress: 3312 on 5638  Progress: 3313 on 5638  Progress: 3314 on 5638  Progress: 3315 on 5638  Progress: 3316 on 5638  Progress: 3317 on 5638  Progress: 3318 on 5638  Progress: 3319 on 5638  Progress: 3320 on 5638  Progress: 3321 on 5638  Progress: 3322 on 5638  Progress: 3323 on 5638  Progress: 3324 on 5638  Progress: 3325 on 5638  Progress: 3326 on 5638  Progress: 3327 on 5638  Progress: 3328 on 5638  Progress: 3329 on 5638  Progress: 3330 on 5638  Progress: 3331 on 5638  Progress: 3332 on 5638  Progress: 3333 on 5638  Progress: 3334 on 5638  Progress: 3335 on 5638  Progress: 3336 on 5638  Progress: 3337 on 5638  Progress: 3338 on 5638  Progress: 3339 on 5638  Progress: 3340 on 5638  Progress: 3341 on 5638  Progress: 3342 on 5638  Progress: 3343 on 5638  Progress: 3344 on 5638  Progress: 3345 on 5638  Progress: 3346 on 5638  Progress: 3347 on 5638  Progress: 3348 on 5638  Progress: 3349 on 5638  Progress: 3350 on 5638  Progress: 3351 on 5638  Progress: 3352 on 5638  Progress: 3353 on 5638  Progress: 3354 on 5638  Progress: 3355 on 5638  Progress: 3356 on 5638  Progress: 3357 on 5638  Progress: 3358 on 5638  Progress: 3359 on 5638  Progress: 3360 on 5638  Progress: 3361 on 5638  Progress: 3362 on 5638  Progress: 3363 on 5638  Progress: 3364 on 5638  Progress: 3365 on 5638  Progress: 3366 on 5638  Progress: 3367 on 5638  Progress: 3368 on 5638  Progress: 3369 on 5638  Progress: 3370 on 5638  Progress: 3371 on 5638  Progress: 3372 on 5638  Progress: 3373 on 5638  Progress: 3374 on 5638  Progress: 3375 on 5638  Progress: 3376 on 5638  Progress: 3377 on 5638  Progress: 3378 on 5638  Progress: 3379 on 5638  Progress: 3380 on 5638  Progress: 3381 on 5638  Progress: 3382 on 5638  Progress: 3383 on 5638  Progress: 3384 on 5638  Progress: 3385 on 5638  Progress: 3386 on 5638  Progress: 3387 on 5638  Progress: 3388 on 5638  Progress: 3389 on 5638  Progress: 3390 on 5638  Progress: 3391 on 5638  Progress: 3392 on 5638  Progress: 3393 on 5638  Progress: 3394 on 5638  Progress: 3395 on 5638  Progress: 3396 on 5638  Progress: 3397 on 5638  Progress: 3398 on 5638  Progress: 3399 on 5638  Progress: 3400 on 5638  Progress: 3401 on 5638  Progress: 3402 on 5638  Progress: 3403 on 5638  Progress: 3404 on 5638  Progress: 3405 on 5638  Progress: 3406 on 5638  Progress: 3407 on 5638  Progress: 3408 on 5638  Progress: 3409 on 5638  Progress: 3410 on 5638  Progress: 3411 on 5638  Progress: 3412 on 5638  Progress: 3413 on 5638  Progress: 3414 on 5638  Progress: 3415 on 5638  Progress: 3416 on 5638  Progress: 3417 on 5638  Progress: 3418 on 5638  Progress: 3419 on 5638  Progress: 3420 on 5638  Progress: 3421 on 5638  Progress: 3422 on 5638  Progress: 3423 on 5638  Progress: 3424 on 5638  Progress: 3425 on 5638  Progress: 3426 on 5638  Progress: 3427 on 5638  Progress: 3428 on 5638  Progress: 3429 on 5638  Progress: 3430 on 5638  Progress: 3431 on 5638  Progress: 3432 on 5638  Progress: 3433 on 5638  Progress: 3434 on 5638  Progress: 3435 on 5638  Progress: 3436 on 5638  Progress: 3437 on 5638  Progress: 3438 on 5638  Progress: 3439 on 5638  Progress: 3440 on 5638  Progress: 3441 on 5638  Progress: 3442 on 5638  Progress: 3443 on 5638  Progress: 3444 on 5638  Progress: 3445 on 5638  Progress: 3446 on 5638  Progress: 3447 on 5638  Progress: 3448 on 5638  Progress: 3449 on 5638  Progress: 3450 on 5638  Progress: 3451 on 5638  Progress: 3452 on 5638  Progress: 3453 on 5638  Progress: 3454 on 5638  Progress: 3455 on 5638  Progress: 3456 on 5638  Progress: 3457 on 5638  Progress: 3458 on 5638  Progress: 3459 on 5638  Progress: 3460 on 5638  Progress: 3461 on 5638  Progress: 3462 on 5638  Progress: 3463 on 5638  Progress: 3464 on 5638  Progress: 3465 on 5638  Progress: 3466 on 5638  Progress: 3467 on 5638  Progress: 3468 on 5638  Progress: 3469 on 5638  Progress: 3470 on 5638  Progress: 3471 on 5638  Progress: 3472 on 5638  Progress: 3473 on 5638  Progress: 3474 on 5638  Progress: 3475 on 5638  Progress: 3476 on 5638  Progress: 3477 on 5638  Progress: 3478 on 5638  Progress: 3479 on 5638  Progress: 3480 on 5638  Progress: 3481 on 5638  Progress: 3482 on 5638  Progress: 3483 on 5638  Progress: 3484 on 5638  Progress: 3485 on 5638  Progress: 3486 on 5638  Progress: 3487 on 5638  Progress: 3488 on 5638  Progress: 3489 on 5638  Progress: 3490 on 5638  Progress: 3491 on 5638  Progress: 3492 on 5638  Progress: 3493 on 5638  Progress: 3494 on 5638  Progress: 3495 on 5638  Progress: 3496 on 5638  Progress: 3497 on 5638  Progress: 3498 on 5638  Progress: 3499 on 5638  Progress: 3500 on 5638  Progress: 3501 on 5638  Progress: 3502 on 5638  Progress: 3503 on 5638  Progress: 3504 on 5638  Progress: 3505 on 5638  Progress: 3506 on 5638  Progress: 3507 on 5638  Progress: 3508 on 5638  Progress: 3509 on 5638  Progress: 3510 on 5638  Progress: 3511 on 5638  Progress: 3512 on 5638  Progress: 3513 on 5638  Progress: 3514 on 5638  Progress: 3515 on 5638  Progress: 3516 on 5638  Progress: 3517 on 5638  Progress: 3518 on 5638  Progress: 3519 on 5638  Progress: 3520 on 5638  Progress: 3521 on 5638  Progress: 3522 on 5638  Progress: 3523 on 5638  Progress: 3524 on 5638  Progress: 3525 on 5638  Progress: 3526 on 5638  Progress: 3527 on 5638  Progress: 3528 on 5638  Progress: 3529 on 5638  Progress: 3530 on 5638  Progress: 3531 on 5638  Progress: 3532 on 5638  Progress: 3533 on 5638  Progress: 3534 on 5638  Progress: 3535 on 5638  Progress: 3536 on 5638  Progress: 3537 on 5638  Progress: 3538 on 5638  Progress: 3539 on 5638  Progress: 3540 on 5638  Progress: 3541 on 5638  Progress: 3542 on 5638  Progress: 3543 on 5638  Progress: 3544 on 5638  Progress: 3545 on 5638  Progress: 3546 on 5638  Progress: 3547 on 5638  Progress: 3548 on 5638  Progress: 3549 on 5638  Progress: 3550 on 5638  Progress: 3551 on 5638  Progress: 3552 on 5638  Progress: 3553 on 5638  Progress: 3554 on 5638  Progress: 3555 on 5638  Progress: 3556 on 5638  Progress: 3557 on 5638  Progress: 3558 on 5638  Progress: 3559 on 5638  Progress: 3560 on 5638  Progress: 3561 on 5638  Progress: 3562 on 5638  Progress: 3563 on 5638  Progress: 3564 on 5638  Progress: 3565 on 5638  Progress: 3566 on 5638  Progress: 3567 on 5638  Progress: 3568 on 5638  Progress: 3569 on 5638  Progress: 3570 on 5638  Progress: 3571 on 5638  Progress: 3572 on 5638  Progress: 3573 on 5638  Progress: 3574 on 5638  Progress: 3575 on 5638  Progress: 3576 on 5638  Progress: 3577 on 5638  Progress: 3578 on 5638  Progress: 3579 on 5638  Progress: 3580 on 5638  Progress: 3581 on 5638  Progress: 3582 on 5638  Progress: 3583 on 5638  Progress: 3584 on 5638  Progress: 3585 on 5638  Progress: 3586 on 5638  Progress: 3587 on 5638  Progress: 3588 on 5638  Progress: 3589 on 5638  Progress: 3590 on 5638  Progress: 3591 on 5638  Progress: 3592 on 5638  Progress: 3593 on 5638  Progress: 3594 on 5638  Progress: 3595 on 5638  Progress: 3596 on 5638  Progress: 3597 on 5638  Progress: 3598 on 5638  Progress: 3599 on 5638  Progress: 3600 on 5638  Progress: 3601 on 5638  Progress: 3602 on 5638  Progress: 3603 on 5638  Progress: 3604 on 5638  Progress: 3605 on 5638  Progress: 3606 on 5638  Progress: 3607 on 5638  Progress: 3608 on 5638  Progress: 3609 on 5638  Progress: 3610 on 5638  Progress: 3611 on 5638  Progress: 3612 on 5638  Progress: 3613 on 5638  Progress: 3614 on 5638  Progress: 3615 on 5638  Progress: 3616 on 5638  Progress: 3617 on 5638  Progress: 3618 on 5638  Progress: 3619 on 5638  Progress: 3620 on 5638  Progress: 3621 on 5638  Progress: 3622 on 5638  Progress: 3623 on 5638  Progress: 3624 on 5638  Progress: 3625 on 5638  Progress: 3626 on 5638  Progress: 3627 on 5638  Progress: 3628 on 5638  Progress: 3629 on 5638  Progress: 3630 on 5638  Progress: 3631 on 5638  Progress: 3632 on 5638  Progress: 3633 on 5638  Progress: 3634 on 5638  Progress: 3635 on 5638  Progress: 3636 on 5638  Progress: 3637 on 5638  Progress: 3638 on 5638  Progress: 3639 on 5638  Progress: 3640 on 5638  Progress: 3641 on 5638  Progress: 3642 on 5638  Progress: 3643 on 5638  Progress: 3644 on 5638  Progress: 3645 on 5638  Progress: 3646 on 5638  Progress: 3647 on 5638  Progress: 3648 on 5638  Progress: 3649 on 5638  Progress: 3650 on 5638  Progress: 3651 on 5638  Progress: 3652 on 5638  Progress: 3653 on 5638  Progress: 3654 on 5638  Progress: 3655 on 5638  Progress: 3656 on 5638  Progress: 3657 on 5638  Progress: 3658 on 5638  Progress: 3659 on 5638  Progress: 3660 on 5638  Progress: 3661 on 5638  Progress: 3662 on 5638  Progress: 3663 on 5638  Progress: 3664 on 5638  Progress: 3665 on 5638  Progress: 3666 on 5638  Progress: 3667 on 5638  Progress: 3668 on 5638  Progress: 3669 on 5638  Progress: 3670 on 5638  Progress: 3671 on 5638  Progress: 3672 on 5638  Progress: 3673 on 5638  Progress: 3674 on 5638  Progress: 3675 on 5638  Progress: 3676 on 5638  Progress: 3677 on 5638  Progress: 3678 on 5638  Progress: 3679 on 5638  Progress: 3680 on 5638  Progress: 3681 on 5638  Progress: 3682 on 5638  Progress: 3683 on 5638  Progress: 3684 on 5638  Progress: 3685 on 5638  Progress: 3686 on 5638  Progress: 3687 on 5638  Progress: 3688 on 5638  Progress: 3689 on 5638  Progress: 3690 on 5638  Progress: 3691 on 5638  Progress: 3692 on 5638  Progress: 3693 on 5638  Progress: 3694 on 5638  Progress: 3695 on 5638  Progress: 3696 on 5638  Progress: 3697 on 5638  Progress: 3698 on 5638  Progress: 3699 on 5638  Progress: 3700 on 5638  Progress: 3701 on 5638  Progress: 3702 on 5638  Progress: 3703 on 5638  Progress: 3704 on 5638  Progress: 3705 on 5638  Progress: 3706 on 5638  Progress: 3707 on 5638  Progress: 3708 on 5638  Progress: 3709 on 5638  Progress: 3710 on 5638  Progress: 3711 on 5638  Progress: 3712 on 5638  Progress: 3713 on 5638  Progress: 3714 on 5638  Progress: 3715 on 5638  Progress: 3716 on 5638  Progress: 3717 on 5638  Progress: 3718 on 5638  Progress: 3719 on 5638  Progress: 3720 on 5638  Progress: 3721 on 5638  Progress: 3722 on 5638  Progress: 3723 on 5638  Progress: 3724 on 5638  Progress: 3725 on 5638  Progress: 3726 on 5638  Progress: 3727 on 5638  Progress: 3728 on 5638  Progress: 3729 on 5638  Progress: 3730 on 5638  Progress: 3731 on 5638  Progress: 3732 on 5638  Progress: 3733 on 5638  Progress: 3734 on 5638  Progress: 3735 on 5638  Progress: 3736 on 5638  Progress: 3737 on 5638  Progress: 3738 on 5638  Progress: 3739 on 5638  Progress: 3740 on 5638  Progress: 3741 on 5638  Progress: 3742 on 5638  Progress: 3743 on 5638  Progress: 3744 on 5638  Progress: 3745 on 5638  Progress: 3746 on 5638  Progress: 3747 on 5638  Progress: 3748 on 5638  Progress: 3749 on 5638  Progress: 3750 on 5638  Progress: 3751 on 5638  Progress: 3752 on 5638  Progress: 3753 on 5638  Progress: 3754 on 5638  Progress: 3755 on 5638  Progress: 3756 on 5638  Progress: 3757 on 5638  Progress: 3758 on 5638  Progress: 3759 on 5638  Progress: 3760 on 5638  Progress: 3761 on 5638  Progress: 3762 on 5638  Progress: 3763 on 5638  Progress: 3764 on 5638  Progress: 3765 on 5638  Progress: 3766 on 5638  Progress: 3767 on 5638  Progress: 3768 on 5638  Progress: 3769 on 5638  Progress: 3770 on 5638  Progress: 3771 on 5638  Progress: 3772 on 5638  Progress: 3773 on 5638  Progress: 3774 on 5638  Progress: 3775 on 5638  Progress: 3776 on 5638  Progress: 3777 on 5638  Progress: 3778 on 5638  Progress: 3779 on 5638  Progress: 3780 on 5638  Progress: 3781 on 5638  Progress: 3782 on 5638  Progress: 3783 on 5638  Progress: 3784 on 5638  Progress: 3785 on 5638  Progress: 3786 on 5638  Progress: 3787 on 5638  Progress: 3788 on 5638  Progress: 3789 on 5638  Progress: 3790 on 5638  Progress: 3791 on 5638  Progress: 3792 on 5638  Progress: 3793 on 5638  Progress: 3794 on 5638  Progress: 3795 on 5638  Progress: 3796 on 5638  Progress: 3797 on 5638  Progress: 3798 on 5638  Progress: 3799 on 5638  Progress: 3800 on 5638  Progress: 3801 on 5638  Progress: 3802 on 5638  Progress: 3803 on 5638  Progress: 3804 on 5638  Progress: 3805 on 5638  Progress: 3806 on 5638  Progress: 3807 on 5638  Progress: 3808 on 5638  Progress: 3809 on 5638  Progress: 3810 on 5638  Progress: 3811 on 5638  Progress: 3812 on 5638  Progress: 3813 on 5638  Progress: 3814 on 5638  Progress: 3815 on 5638  Progress: 3816 on 5638  Progress: 3817 on 5638  Progress: 3818 on 5638  Progress: 3819 on 5638  Progress: 3820 on 5638  Progress: 3821 on 5638  Progress: 3822 on 5638  Progress: 3823 on 5638  Progress: 3824 on 5638  Progress: 3825 on 5638  Progress: 3826 on 5638  Progress: 3827 on 5638  Progress: 3828 on 5638  Progress: 3829 on 5638  Progress: 3830 on 5638  Progress: 3831 on 5638  Progress: 3832 on 5638  Progress: 3833 on 5638  Progress: 3834 on 5638  Progress: 3835 on 5638  Progress: 3836 on 5638  Progress: 3837 on 5638  Progress: 3838 on 5638  Progress: 3839 on 5638  Progress: 3840 on 5638  Progress: 3841 on 5638  Progress: 3842 on 5638  Progress: 3843 on 5638  Progress: 3844 on 5638  Progress: 3845 on 5638  Progress: 3846 on 5638  Progress: 3847 on 5638  Progress: 3848 on 5638  Progress: 3849 on 5638  Progress: 3850 on 5638  Progress: 3851 on 5638  Progress: 3852 on 5638  Progress: 3853 on 5638  Progress: 3854 on 5638  Progress: 3855 on 5638  Progress: 3856 on 5638  Progress: 3857 on 5638  Progress: 3858 on 5638  Progress: 3859 on 5638  Progress: 3860 on 5638  Progress: 3861 on 5638  Progress: 3862 on 5638  Progress: 3863 on 5638  Progress: 3864 on 5638  Progress: 3865 on 5638  Progress: 3866 on 5638  Progress: 3867 on 5638  Progress: 3868 on 5638  Progress: 3869 on 5638  Progress: 3870 on 5638  Progress: 3871 on 5638  Progress: 3872 on 5638  Progress: 3873 on 5638  Progress: 3874 on 5638  Progress: 3875 on 5638  Progress: 3876 on 5638  Progress: 3877 on 5638  Progress: 3878 on 5638  Progress: 3879 on 5638  Progress: 3880 on 5638  Progress: 3881 on 5638  Progress: 3882 on 5638  Progress: 3883 on 5638  Progress: 3884 on 5638  Progress: 3885 on 5638  Progress: 3886 on 5638  Progress: 3887 on 5638  Progress: 3888 on 5638  Progress: 3889 on 5638  Progress: 3890 on 5638  Progress: 3891 on 5638  Progress: 3892 on 5638  Progress: 3893 on 5638  Progress: 3894 on 5638  Progress: 3895 on 5638  Progress: 3896 on 5638  Progress: 3897 on 5638  Progress: 3898 on 5638  Progress: 3899 on 5638  Progress: 3900 on 5638  Progress: 3901 on 5638  Progress: 3902 on 5638  Progress: 3903 on 5638  Progress: 3904 on 5638  Progress: 3905 on 5638  Progress: 3906 on 5638  Progress: 3907 on 5638  Progress: 3908 on 5638  Progress: 3909 on 5638  Progress: 3910 on 5638  Progress: 3911 on 5638  Progress: 3912 on 5638  Progress: 3913 on 5638  Progress: 3914 on 5638  Progress: 3915 on 5638  Progress: 3916 on 5638  Progress: 3917 on 5638  Progress: 3918 on 5638  Progress: 3919 on 5638  Progress: 3920 on 5638  Progress: 3921 on 5638  Progress: 3922 on 5638  Progress: 3923 on 5638  Progress: 3924 on 5638  Progress: 3925 on 5638  Progress: 3926 on 5638  Progress: 3927 on 5638  Progress: 3928 on 5638  Progress: 3929 on 5638  Progress: 3930 on 5638  Progress: 3931 on 5638  Progress: 3932 on 5638  Progress: 3933 on 5638  Progress: 3934 on 5638  Progress: 3935 on 5638  Progress: 3936 on 5638  Progress: 3937 on 5638  Progress: 3938 on 5638  Progress: 3939 on 5638  Progress: 3940 on 5638  Progress: 3941 on 5638  Progress: 3942 on 5638  Progress: 3943 on 5638  Progress: 3944 on 5638  Progress: 3945 on 5638  Progress: 3946 on 5638  Progress: 3947 on 5638  Progress: 3948 on 5638  Progress: 3949 on 5638  Progress: 3950 on 5638  Progress: 3951 on 5638  Progress: 3952 on 5638  Progress: 3953 on 5638  Progress: 3954 on 5638  Progress: 3955 on 5638  Progress: 3956 on 5638  Progress: 3957 on 5638  Progress: 3958 on 5638  Progress: 3959 on 5638  Progress: 3960 on 5638  Progress: 3961 on 5638  Progress: 3962 on 5638  Progress: 3963 on 5638  Progress: 3964 on 5638  Progress: 3965 on 5638  Progress: 3966 on 5638  Progress: 3967 on 5638  Progress: 3968 on 5638  Progress: 3969 on 5638  Progress: 3970 on 5638  Progress: 3971 on 5638  Progress: 3972 on 5638  Progress: 3973 on 5638  Progress: 3974 on 5638  Progress: 3975 on 5638  Progress: 3976 on 5638  Progress: 3977 on 5638  Progress: 3978 on 5638  Progress: 3979 on 5638  Progress: 3980 on 5638  Progress: 3981 on 5638  Progress: 3982 on 5638  Progress: 3983 on 5638  Progress: 3984 on 5638  Progress: 3985 on 5638  Progress: 3986 on 5638  Progress: 3987 on 5638  Progress: 3988 on 5638  Progress: 3989 on 5638  Progress: 3990 on 5638  Progress: 3991 on 5638  Progress: 3992 on 5638  Progress: 3993 on 5638  Progress: 3994 on 5638  Progress: 3995 on 5638  Progress: 3996 on 5638  Progress: 3997 on 5638  Progress: 3998 on 5638  Progress: 3999 on 5638  Progress: 4000 on 5638  Progress: 4001 on 5638  Progress: 4002 on 5638  Progress: 4003 on 5638  Progress: 4004 on 5638  Progress: 4005 on 5638  Progress: 4006 on 5638  Progress: 4007 on 5638  Progress: 4008 on 5638  Progress: 4009 on 5638  Progress: 4010 on 5638  Progress: 4011 on 5638  Progress: 4012 on 5638  Progress: 4013 on 5638  Progress: 4014 on 5638  Progress: 4015 on 5638  Progress: 4016 on 5638  Progress: 4017 on 5638  Progress: 4018 on 5638  Progress: 4019 on 5638  Progress: 4020 on 5638  Progress: 4021 on 5638  Progress: 4022 on 5638  Progress: 4023 on 5638  Progress: 4024 on 5638  Progress: 4025 on 5638  Progress: 4026 on 5638  Progress: 4027 on 5638  Progress: 4028 on 5638  Progress: 4029 on 5638  Progress: 4030 on 5638  Progress: 4031 on 5638  Progress: 4032 on 5638  Progress: 4033 on 5638  Progress: 4034 on 5638  Progress: 4035 on 5638  Progress: 4036 on 5638  Progress: 4037 on 5638  Progress: 4038 on 5638  Progress: 4039 on 5638  Progress: 4040 on 5638  Progress: 4041 on 5638  Progress: 4042 on 5638  Progress: 4043 on 5638  Progress: 4044 on 5638  Progress: 4045 on 5638  Progress: 4046 on 5638  Progress: 4047 on 5638  Progress: 4048 on 5638  Progress: 4049 on 5638  Progress: 4050 on 5638  Progress: 4051 on 5638  Progress: 4052 on 5638  Progress: 4053 on 5638  Progress: 4054 on 5638  Progress: 4055 on 5638  Progress: 4056 on 5638  Progress: 4057 on 5638  Progress: 4058 on 5638  Progress: 4059 on 5638  Progress: 4060 on 5638  Progress: 4061 on 5638  Progress: 4062 on 5638  Progress: 4063 on 5638  Progress: 4064 on 5638  Progress: 4065 on 5638  Progress: 4066 on 5638  Progress: 4067 on 5638  Progress: 4068 on 5638  Progress: 4069 on 5638  Progress: 4070 on 5638  Progress: 4071 on 5638  Progress: 4072 on 5638  Progress: 4073 on 5638  Progress: 4074 on 5638  Progress: 4075 on 5638  Progress: 4076 on 5638  Progress: 4077 on 5638  Progress: 4078 on 5638  Progress: 4079 on 5638  Progress: 4080 on 5638  Progress: 4081 on 5638  Progress: 4082 on 5638  Progress: 4083 on 5638  Progress: 4084 on 5638  Progress: 4085 on 5638  Progress: 4086 on 5638  Progress: 4087 on 5638  Progress: 4088 on 5638  Progress: 4089 on 5638  Progress: 4090 on 5638  Progress: 4091 on 5638  Progress: 4092 on 5638  Progress: 4093 on 5638  Progress: 4094 on 5638  Progress: 4095 on 5638  Progress: 4096 on 5638  Progress: 4097 on 5638  Progress: 4098 on 5638  Progress: 4099 on 5638  Progress: 4100 on 5638  Progress: 4101 on 5638  Progress: 4102 on 5638  Progress: 4103 on 5638  Progress: 4104 on 5638  Progress: 4105 on 5638  Progress: 4106 on 5638  Progress: 4107 on 5638  Progress: 4108 on 5638  Progress: 4109 on 5638  Progress: 4110 on 5638  Progress: 4111 on 5638  Progress: 4112 on 5638  Progress: 4113 on 5638  Progress: 4114 on 5638  Progress: 4115 on 5638  Progress: 4116 on 5638  Progress: 4117 on 5638  Progress: 4118 on 5638  Progress: 4119 on 5638  Progress: 4120 on 5638  Progress: 4121 on 5638  Progress: 4122 on 5638  Progress: 4123 on 5638  Progress: 4124 on 5638  Progress: 4125 on 5638  Progress: 4126 on 5638  Progress: 4127 on 5638  Progress: 4128 on 5638  Progress: 4129 on 5638  Progress: 4130 on 5638  Progress: 4131 on 5638  Progress: 4132 on 5638  Progress: 4133 on 5638  Progress: 4134 on 5638  Progress: 4135 on 5638  Progress: 4136 on 5638  Progress: 4137 on 5638  Progress: 4138 on 5638  Progress: 4139 on 5638  Progress: 4140 on 5638  Progress: 4141 on 5638  Progress: 4142 on 5638  Progress: 4143 on 5638  Progress: 4144 on 5638  Progress: 4145 on 5638  Progress: 4146 on 5638  Progress: 4147 on 5638  Progress: 4148 on 5638  Progress: 4149 on 5638  Progress: 4150 on 5638  Progress: 4151 on 5638  Progress: 4152 on 5638  Progress: 4153 on 5638  Progress: 4154 on 5638  Progress: 4155 on 5638  Progress: 4156 on 5638  Progress: 4157 on 5638  Progress: 4158 on 5638  Progress: 4159 on 5638  Progress: 4160 on 5638  Progress: 4161 on 5638  Progress: 4162 on 5638  Progress: 4163 on 5638  Progress: 4164 on 5638  Progress: 4165 on 5638  Progress: 4166 on 5638  Progress: 4167 on 5638  Progress: 4168 on 5638  Progress: 4169 on 5638  Progress: 4170 on 5638  Progress: 4171 on 5638  Progress: 4172 on 5638  Progress: 4173 on 5638  Progress: 4174 on 5638  Progress: 4175 on 5638  Progress: 4176 on 5638  Progress: 4177 on 5638  Progress: 4178 on 5638  Progress: 4179 on 5638  Progress: 4180 on 5638  Progress: 4181 on 5638  Progress: 4182 on 5638  Progress: 4183 on 5638  Progress: 4184 on 5638  Progress: 4185 on 5638  Progress: 4186 on 5638  Progress: 4187 on 5638  Progress: 4188 on 5638  Progress: 4189 on 5638  Progress: 4190 on 5638  Progress: 4191 on 5638  Progress: 4192 on 5638  Progress: 4193 on 5638  Progress: 4194 on 5638  Progress: 4195 on 5638  Progress: 4196 on 5638  Progress: 4197 on 5638  Progress: 4198 on 5638  Progress: 4199 on 5638  Progress: 4200 on 5638  Progress: 4201 on 5638  Progress: 4202 on 5638  Progress: 4203 on 5638  Progress: 4204 on 5638  Progress: 4205 on 5638  Progress: 4206 on 5638  Progress: 4207 on 5638  Progress: 4208 on 5638  Progress: 4209 on 5638  Progress: 4210 on 5638  Progress: 4211 on 5638  Progress: 4212 on 5638  Progress: 4213 on 5638  Progress: 4214 on 5638  Progress: 4215 on 5638  Progress: 4216 on 5638  Progress: 4217 on 5638  Progress: 4218 on 5638  Progress: 4219 on 5638  Progress: 4220 on 5638  Progress: 4221 on 5638  Progress: 4222 on 5638  Progress: 4223 on 5638  Progress: 4224 on 5638  Progress: 4225 on 5638  Progress: 4226 on 5638  Progress: 4227 on 5638  Progress: 4228 on 5638  Progress: 4229 on 5638  Progress: 4230 on 5638  Progress: 4231 on 5638  Progress: 4232 on 5638  Progress: 4233 on 5638  Progress: 4234 on 5638  Progress: 4235 on 5638  Progress: 4236 on 5638  Progress: 4237 on 5638  Progress: 4238 on 5638  Progress: 4239 on 5638  Progress: 4240 on 5638  Progress: 4241 on 5638  Progress: 4242 on 5638  Progress: 4243 on 5638  Progress: 4244 on 5638  Progress: 4245 on 5638  Progress: 4246 on 5638  Progress: 4247 on 5638  Progress: 4248 on 5638  Progress: 4249 on 5638  Progress: 4250 on 5638  Progress: 4251 on 5638  Progress: 4252 on 5638  Progress: 4253 on 5638  Progress: 4254 on 5638  Progress: 4255 on 5638  Progress: 4256 on 5638  Progress: 4257 on 5638  Progress: 4258 on 5638  Progress: 4259 on 5638  Progress: 4260 on 5638  Progress: 4261 on 5638  Progress: 4262 on 5638  Progress: 4263 on 5638  Progress: 4264 on 5638  Progress: 4265 on 5638  Progress: 4266 on 5638  Progress: 4267 on 5638  Progress: 4268 on 5638  Progress: 4269 on 5638  Progress: 4270 on 5638  Progress: 4271 on 5638  Progress: 4272 on 5638  Progress: 4273 on 5638  Progress: 4274 on 5638  Progress: 4275 on 5638  Progress: 4276 on 5638  Progress: 4277 on 5638  Progress: 4278 on 5638  Progress: 4279 on 5638  Progress: 4280 on 5638  Progress: 4281 on 5638  Progress: 4282 on 5638  Progress: 4283 on 5638  Progress: 4284 on 5638  Progress: 4285 on 5638  Progress: 4286 on 5638  Progress: 4287 on 5638  Progress: 4288 on 5638  Progress: 4289 on 5638  Progress: 4290 on 5638  Progress: 4291 on 5638  Progress: 4292 on 5638  Progress: 4293 on 5638  Progress: 4294 on 5638  Progress: 4295 on 5638  Progress: 4296 on 5638  Progress: 4297 on 5638  Progress: 4298 on 5638  Progress: 4299 on 5638  Progress: 4300 on 5638  Progress: 4301 on 5638  Progress: 4302 on 5638  Progress: 4303 on 5638  Progress: 4304 on 5638  Progress: 4305 on 5638  Progress: 4306 on 5638  Progress: 4307 on 5638  Progress: 4308 on 5638  Progress: 4309 on 5638  Progress: 4310 on 5638  Progress: 4311 on 5638  Progress: 4312 on 5638  Progress: 4313 on 5638  Progress: 4314 on 5638  Progress: 4315 on 5638  Progress: 4316 on 5638  Progress: 4317 on 5638  Progress: 4318 on 5638  Progress: 4319 on 5638  Progress: 4320 on 5638  Progress: 4321 on 5638  Progress: 4322 on 5638  Progress: 4323 on 5638  Progress: 4324 on 5638  Progress: 4325 on 5638  Progress: 4326 on 5638  Progress: 4327 on 5638  Progress: 4328 on 5638  Progress: 4329 on 5638  Progress: 4330 on 5638  Progress: 4331 on 5638  Progress: 4332 on 5638  Progress: 4333 on 5638  Progress: 4334 on 5638  Progress: 4335 on 5638  Progress: 4336 on 5638  Progress: 4337 on 5638  Progress: 4338 on 5638  Progress: 4339 on 5638  Progress: 4340 on 5638  Progress: 4341 on 5638  Progress: 4342 on 5638  Progress: 4343 on 5638  Progress: 4344 on 5638  Progress: 4345 on 5638  Progress: 4346 on 5638  Progress: 4347 on 5638  Progress: 4348 on 5638  Progress: 4349 on 5638  Progress: 4350 on 5638  Progress: 4351 on 5638  Progress: 4352 on 5638  Progress: 4353 on 5638  Progress: 4354 on 5638  Progress: 4355 on 5638  Progress: 4356 on 5638  Progress: 4357 on 5638  Progress: 4358 on 5638  Progress: 4359 on 5638  Progress: 4360 on 5638  Progress: 4361 on 5638  Progress: 4362 on 5638  Progress: 4363 on 5638  Progress: 4364 on 5638  Progress: 4365 on 5638  Progress: 4366 on 5638  Progress: 4367 on 5638  Progress: 4368 on 5638  Progress: 4369 on 5638  Progress: 4370 on 5638  Progress: 4371 on 5638  Progress: 4372 on 5638  Progress: 4373 on 5638  Progress: 4374 on 5638  Progress: 4375 on 5638  Progress: 4376 on 5638  Progress: 4377 on 5638  Progress: 4378 on 5638  Progress: 4379 on 5638  Progress: 4380 on 5638  Progress: 4381 on 5638  Progress: 4382 on 5638  Progress: 4383 on 5638  Progress: 4384 on 5638  Progress: 4385 on 5638  Progress: 4386 on 5638  Progress: 4387 on 5638  Progress: 4388 on 5638  Progress: 4389 on 5638  Progress: 4390 on 5638  Progress: 4391 on 5638  Progress: 4392 on 5638  Progress: 4393 on 5638  Progress: 4394 on 5638  Progress: 4395 on 5638  Progress: 4396 on 5638  Progress: 4397 on 5638  Progress: 4398 on 5638  Progress: 4399 on 5638  Progress: 4400 on 5638  Progress: 4401 on 5638  Progress: 4402 on 5638  Progress: 4403 on 5638  Progress: 4404 on 5638  Progress: 4405 on 5638  Progress: 4406 on 5638  Progress: 4407 on 5638  Progress: 4408 on 5638  Progress: 4409 on 5638  Progress: 4410 on 5638  Progress: 4411 on 5638  Progress: 4412 on 5638  Progress: 4413 on 5638  Progress: 4414 on 5638  Progress: 4415 on 5638  Progress: 4416 on 5638  Progress: 4417 on 5638  Progress: 4418 on 5638  Progress: 4419 on 5638  Progress: 4420 on 5638  Progress: 4421 on 5638  Progress: 4422 on 5638  Progress: 4423 on 5638  Progress: 4424 on 5638  Progress: 4425 on 5638  Progress: 4426 on 5638  Progress: 4427 on 5638  Progress: 4428 on 5638  Progress: 4429 on 5638  Progress: 4430 on 5638  Progress: 4431 on 5638  Progress: 4432 on 5638  Progress: 4433 on 5638  Progress: 4434 on 5638  Progress: 4435 on 5638  Progress: 4436 on 5638  Progress: 4437 on 5638  Progress: 4438 on 5638  Progress: 4439 on 5638  Progress: 4440 on 5638  Progress: 4441 on 5638  Progress: 4442 on 5638  Progress: 4443 on 5638  Progress: 4444 on 5638  Progress: 4445 on 5638  Progress: 4446 on 5638  Progress: 4447 on 5638  Progress: 4448 on 5638  Progress: 4449 on 5638  Progress: 4450 on 5638  Progress: 4451 on 5638  Progress: 4452 on 5638  Progress: 4453 on 5638  Progress: 4454 on 5638  Progress: 4455 on 5638  Progress: 4456 on 5638  Progress: 4457 on 5638  Progress: 4458 on 5638  Progress: 4459 on 5638  Progress: 4460 on 5638  Progress: 4461 on 5638  Progress: 4462 on 5638  Progress: 4463 on 5638  Progress: 4464 on 5638  Progress: 4465 on 5638  Progress: 4466 on 5638  Progress: 4467 on 5638  Progress: 4468 on 5638  Progress: 4469 on 5638  Progress: 4470 on 5638  Progress: 4471 on 5638  Progress: 4472 on 5638  Progress: 4473 on 5638  Progress: 4474 on 5638  Progress: 4475 on 5638  Progress: 4476 on 5638  Progress: 4477 on 5638  Progress: 4478 on 5638  Progress: 4479 on 5638  Progress: 4480 on 5638  Progress: 4481 on 5638  Progress: 4482 on 5638  Progress: 4483 on 5638  Progress: 4484 on 5638  Progress: 4485 on 5638  Progress: 4486 on 5638  Progress: 4487 on 5638  Progress: 4488 on 5638  Progress: 4489 on 5638  Progress: 4490 on 5638  Progress: 4491 on 5638  Progress: 4492 on 5638  Progress: 4493 on 5638  Progress: 4494 on 5638  Progress: 4495 on 5638  Progress: 4496 on 5638  Progress: 4497 on 5638  Progress: 4498 on 5638  Progress: 4499 on 5638  Progress: 4500 on 5638  Progress: 4501 on 5638  Progress: 4502 on 5638  Progress: 4503 on 5638  Progress: 4504 on 5638  Progress: 4505 on 5638  Progress: 4506 on 5638  Progress: 4507 on 5638  Progress: 4508 on 5638  Progress: 4509 on 5638  Progress: 4510 on 5638  Progress: 4511 on 5638  Progress: 4512 on 5638  Progress: 4513 on 5638  Progress: 4514 on 5638  Progress: 4515 on 5638  Progress: 4516 on 5638  Progress: 4517 on 5638  Progress: 4518 on 5638  Progress: 4519 on 5638  Progress: 4520 on 5638  Progress: 4521 on 5638  Progress: 4522 on 5638  Progress: 4523 on 5638  Progress: 4524 on 5638  Progress: 4525 on 5638  Progress: 4526 on 5638  Progress: 4527 on 5638  Progress: 4528 on 5638  Progress: 4529 on 5638  Progress: 4530 on 5638  Progress: 4531 on 5638  Progress: 4532 on 5638  Progress: 4533 on 5638  Progress: 4534 on 5638  Progress: 4535 on 5638  Progress: 4536 on 5638  Progress: 4537 on 5638  Progress: 4538 on 5638  Progress: 4539 on 5638  Progress: 4540 on 5638  Progress: 4541 on 5638  Progress: 4542 on 5638  Progress: 4543 on 5638  Progress: 4544 on 5638  Progress: 4545 on 5638  Progress: 4546 on 5638  Progress: 4547 on 5638  Progress: 4548 on 5638  Progress: 4549 on 5638  Progress: 4550 on 5638  Progress: 4551 on 5638  Progress: 4552 on 5638  Progress: 4553 on 5638  Progress: 4554 on 5638  Progress: 4555 on 5638  Progress: 4556 on 5638  Progress: 4557 on 5638  Progress: 4558 on 5638  Progress: 4559 on 5638  Progress: 4560 on 5638  Progress: 4561 on 5638  Progress: 4562 on 5638  Progress: 4563 on 5638  Progress: 4564 on 5638  Progress: 4565 on 5638  Progress: 4566 on 5638  Progress: 4567 on 5638  Progress: 4568 on 5638  Progress: 4569 on 5638  Progress: 4570 on 5638  Progress: 4571 on 5638  Progress: 4572 on 5638  Progress: 4573 on 5638  Progress: 4574 on 5638  Progress: 4575 on 5638  Progress: 4576 on 5638  Progress: 4577 on 5638  Progress: 4578 on 5638  Progress: 4579 on 5638  Progress: 4580 on 5638  Progress: 4581 on 5638  Progress: 4582 on 5638  Progress: 4583 on 5638  Progress: 4584 on 5638  Progress: 4585 on 5638  Progress: 4586 on 5638  Progress: 4587 on 5638  Progress: 4588 on 5638  Progress: 4589 on 5638  Progress: 4590 on 5638  Progress: 4591 on 5638  Progress: 4592 on 5638  Progress: 4593 on 5638  Progress: 4594 on 5638  Progress: 4595 on 5638  Progress: 4596 on 5638  Progress: 4597 on 5638  Progress: 4598 on 5638  Progress: 4599 on 5638  Progress: 4600 on 5638  Progress: 4601 on 5638  Progress: 4602 on 5638  Progress: 4603 on 5638  Progress: 4604 on 5638  Progress: 4605 on 5638  Progress: 4606 on 5638  Progress: 4607 on 5638  Progress: 4608 on 5638  Progress: 4609 on 5638  Progress: 4610 on 5638  Progress: 4611 on 5638  Progress: 4612 on 5638  Progress: 4613 on 5638  Progress: 4614 on 5638  Progress: 4615 on 5638  Progress: 4616 on 5638  Progress: 4617 on 5638  Progress: 4618 on 5638  Progress: 4619 on 5638  Progress: 4620 on 5638  Progress: 4621 on 5638  Progress: 4622 on 5638  Progress: 4623 on 5638  Progress: 4624 on 5638  Progress: 4625 on 5638  Progress: 4626 on 5638  Progress: 4627 on 5638  Progress: 4628 on 5638  Progress: 4629 on 5638  Progress: 4630 on 5638  Progress: 4631 on 5638  Progress: 4632 on 5638  Progress: 4633 on 5638  Progress: 4634 on 5638  Progress: 4635 on 5638  Progress: 4636 on 5638  Progress: 4637 on 5638  Progress: 4638 on 5638  Progress: 4639 on 5638  Progress: 4640 on 5638  Progress: 4641 on 5638  Progress: 4642 on 5638  Progress: 4643 on 5638  Progress: 4644 on 5638  Progress: 4645 on 5638  Progress: 4646 on 5638  Progress: 4647 on 5638  Progress: 4648 on 5638  Progress: 4649 on 5638  Progress: 4650 on 5638  Progress: 4651 on 5638  Progress: 4652 on 5638  Progress: 4653 on 5638  Progress: 4654 on 5638  Progress: 4655 on 5638  Progress: 4656 on 5638  Progress: 4657 on 5638  Progress: 4658 on 5638  Progress: 4659 on 5638  Progress: 4660 on 5638  Progress: 4661 on 5638  Progress: 4662 on 5638  Progress: 4663 on 5638  Progress: 4664 on 5638  Progress: 4665 on 5638  Progress: 4666 on 5638  Progress: 4667 on 5638  Progress: 4668 on 5638  Progress: 4669 on 5638  Progress: 4670 on 5638  Progress: 4671 on 5638  Progress: 4672 on 5638  Progress: 4673 on 5638  Progress: 4674 on 5638  Progress: 4675 on 5638  Progress: 4676 on 5638  Progress: 4677 on 5638  Progress: 4678 on 5638  Progress: 4679 on 5638  Progress: 4680 on 5638  Progress: 4681 on 5638  Progress: 4682 on 5638  Progress: 4683 on 5638  Progress: 4684 on 5638  Progress: 4685 on 5638  Progress: 4686 on 5638  Progress: 4687 on 5638  Progress: 4688 on 5638  Progress: 4689 on 5638  Progress: 4690 on 5638  Progress: 4691 on 5638  Progress: 4692 on 5638  Progress: 4693 on 5638  Progress: 4694 on 5638  Progress: 4695 on 5638  Progress: 4696 on 5638  Progress: 4697 on 5638  Progress: 4698 on 5638  Progress: 4699 on 5638  Progress: 4700 on 5638  Progress: 4701 on 5638  Progress: 4702 on 5638  Progress: 4703 on 5638  Progress: 4704 on 5638  Progress: 4705 on 5638  Progress: 4706 on 5638  Progress: 4707 on 5638  Progress: 4708 on 5638  Progress: 4709 on 5638  Progress: 4710 on 5638  Progress: 4711 on 5638  Progress: 4712 on 5638  Progress: 4713 on 5638  Progress: 4714 on 5638  Progress: 4715 on 5638  Progress: 4716 on 5638  Progress: 4717 on 5638  Progress: 4718 on 5638  Progress: 4719 on 5638  Progress: 4720 on 5638  Progress: 4721 on 5638  Progress: 4722 on 5638  Progress: 4723 on 5638  Progress: 4724 on 5638  Progress: 4725 on 5638  Progress: 4726 on 5638  Progress: 4727 on 5638  Progress: 4728 on 5638  Progress: 4729 on 5638  Progress: 4730 on 5638  Progress: 4731 on 5638  Progress: 4732 on 5638  Progress: 4733 on 5638  Progress: 4734 on 5638  Progress: 4735 on 5638  Progress: 4736 on 5638  Progress: 4737 on 5638  Progress: 4738 on 5638  Progress: 4739 on 5638  Progress: 4740 on 5638  Progress: 4741 on 5638  Progress: 4742 on 5638  Progress: 4743 on 5638  Progress: 4744 on 5638  Progress: 4745 on 5638  Progress: 4746 on 5638  Progress: 4747 on 5638  Progress: 4748 on 5638  Progress: 4749 on 5638  Progress: 4750 on 5638  Progress: 4751 on 5638  Progress: 4752 on 5638  Progress: 4753 on 5638  Progress: 4754 on 5638  Progress: 4755 on 5638  Progress: 4756 on 5638  Progress: 4757 on 5638  Progress: 4758 on 5638  Progress: 4759 on 5638  Progress: 4760 on 5638  Progress: 4761 on 5638  Progress: 4762 on 5638  Progress: 4763 on 5638  Progress: 4764 on 5638  Progress: 4765 on 5638  Progress: 4766 on 5638  Progress: 4767 on 5638  Progress: 4768 on 5638  Progress: 4769 on 5638  Progress: 4770 on 5638  Progress: 4771 on 5638  Progress: 4772 on 5638  Progress: 4773 on 5638  Progress: 4774 on 5638  Progress: 4775 on 5638  Progress: 4776 on 5638  Progress: 4777 on 5638  Progress: 4778 on 5638  Progress: 4779 on 5638  Progress: 4780 on 5638  Progress: 4781 on 5638  Progress: 4782 on 5638  Progress: 4783 on 5638  Progress: 4784 on 5638  Progress: 4785 on 5638  Progress: 4786 on 5638  Progress: 4787 on 5638  Progress: 4788 on 5638  Progress: 4789 on 5638  Progress: 4790 on 5638  Progress: 4791 on 5638  Progress: 4792 on 5638  Progress: 4793 on 5638  Progress: 4794 on 5638  Progress: 4795 on 5638  Progress: 4796 on 5638  Progress: 4797 on 5638  Progress: 4798 on 5638  Progress: 4799 on 5638  Progress: 4800 on 5638  Progress: 4801 on 5638  Progress: 4802 on 5638  Progress: 4803 on 5638  Progress: 4804 on 5638  Progress: 4805 on 5638  Progress: 4806 on 5638  Progress: 4807 on 5638  Progress: 4808 on 5638  Progress: 4809 on 5638  Progress: 4810 on 5638  Progress: 4811 on 5638  Progress: 4812 on 5638  Progress: 4813 on 5638  Progress: 4814 on 5638  Progress: 4815 on 5638  Progress: 4816 on 5638  Progress: 4817 on 5638  Progress: 4818 on 5638  Progress: 4819 on 5638  Progress: 4820 on 5638  Progress: 4821 on 5638  Progress: 4822 on 5638  Progress: 4823 on 5638  Progress: 4824 on 5638  Progress: 4825 on 5638  Progress: 4826 on 5638  Progress: 4827 on 5638  Progress: 4828 on 5638  Progress: 4829 on 5638  Progress: 4830 on 5638  Progress: 4831 on 5638  Progress: 4832 on 5638  Progress: 4833 on 5638  Progress: 4834 on 5638  Progress: 4835 on 5638  Progress: 4836 on 5638  Progress: 4837 on 5638  Progress: 4838 on 5638  Progress: 4839 on 5638  Progress: 4840 on 5638  Progress: 4841 on 5638  Progress: 4842 on 5638  Progress: 4843 on 5638  Progress: 4844 on 5638  Progress: 4845 on 5638  Progress: 4846 on 5638  Progress: 4847 on 5638  Progress: 4848 on 5638  Progress: 4849 on 5638  Progress: 4850 on 5638  Progress: 4851 on 5638  Progress: 4852 on 5638  Progress: 4853 on 5638  Progress: 4854 on 5638  Progress: 4855 on 5638  Progress: 4856 on 5638  Progress: 4857 on 5638  Progress: 4858 on 5638  Progress: 4859 on 5638  Progress: 4860 on 5638  Progress: 4861 on 5638  Progress: 4862 on 5638  Progress: 4863 on 5638  Progress: 4864 on 5638  Progress: 4865 on 5638  Progress: 4866 on 5638  Progress: 4867 on 5638  Progress: 4868 on 5638  Progress: 4869 on 5638  Progress: 4870 on 5638  Progress: 4871 on 5638  Progress: 4872 on 5638  Progress: 4873 on 5638  Progress: 4874 on 5638  Progress: 4875 on 5638  Progress: 4876 on 5638  Progress: 4877 on 5638  Progress: 4878 on 5638  Progress: 4879 on 5638  Progress: 4880 on 5638  Progress: 4881 on 5638  Progress: 4882 on 5638  Progress: 4883 on 5638  Progress: 4884 on 5638  Progress: 4885 on 5638  Progress: 4886 on 5638  Progress: 4887 on 5638  Progress: 4888 on 5638  Progress: 4889 on 5638  Progress: 4890 on 5638  Progress: 4891 on 5638  Progress: 4892 on 5638  Progress: 4893 on 5638  Progress: 4894 on 5638  Progress: 4895 on 5638  Progress: 4896 on 5638  Progress: 4897 on 5638  Progress: 4898 on 5638  Progress: 4899 on 5638  Progress: 4900 on 5638  Progress: 4901 on 5638  Progress: 4902 on 5638  Progress: 4903 on 5638  Progress: 4904 on 5638  Progress: 4905 on 5638  Progress: 4906 on 5638  Progress: 4907 on 5638  Progress: 4908 on 5638  Progress: 4909 on 5638  Progress: 4910 on 5638  Progress: 4911 on 5638  Progress: 4912 on 5638  Progress: 4913 on 5638  Progress: 4914 on 5638  Progress: 4915 on 5638  Progress: 4916 on 5638  Progress: 4917 on 5638  Progress: 4918 on 5638  Progress: 4919 on 5638  Progress: 4920 on 5638  Progress: 4921 on 5638  Progress: 4922 on 5638  Progress: 4923 on 5638  Progress: 4924 on 5638  Progress: 4925 on 5638  Progress: 4926 on 5638  Progress: 4927 on 5638  Progress: 4928 on 5638  Progress: 4929 on 5638  Progress: 4930 on 5638  Progress: 4931 on 5638  Progress: 4932 on 5638  Progress: 4933 on 5638  Progress: 4934 on 5638  Progress: 4935 on 5638  Progress: 4936 on 5638  Progress: 4937 on 5638  Progress: 4938 on 5638  Progress: 4939 on 5638  Progress: 4940 on 5638  Progress: 4941 on 5638  Progress: 4942 on 5638  Progress: 4943 on 5638  Progress: 4944 on 5638  Progress: 4945 on 5638  Progress: 4946 on 5638  Progress: 4947 on 5638  Progress: 4948 on 5638  Progress: 4949 on 5638  Progress: 4950 on 5638  Progress: 4951 on 5638  Progress: 4952 on 5638  Progress: 4953 on 5638  Progress: 4954 on 5638  Progress: 4955 on 5638  Progress: 4956 on 5638  Progress: 4957 on 5638  Progress: 4958 on 5638  Progress: 4959 on 5638  Progress: 4960 on 5638  Progress: 4961 on 5638  Progress: 4962 on 5638  Progress: 4963 on 5638  Progress: 4964 on 5638  Progress: 4965 on 5638  Progress: 4966 on 5638  Progress: 4967 on 5638  Progress: 4968 on 5638  Progress: 4969 on 5638  Progress: 4970 on 5638  Progress: 4971 on 5638  Progress: 4972 on 5638  Progress: 4973 on 5638  Progress: 4974 on 5638  Progress: 4975 on 5638  Progress: 4976 on 5638  Progress: 4977 on 5638  Progress: 4978 on 5638  Progress: 4979 on 5638  Progress: 4980 on 5638  Progress: 4981 on 5638  Progress: 4982 on 5638  Progress: 4983 on 5638  Progress: 4984 on 5638  Progress: 4985 on 5638  Progress: 4986 on 5638  Progress: 4987 on 5638  Progress: 4988 on 5638  Progress: 4989 on 5638  Progress: 4990 on 5638  Progress: 4991 on 5638  Progress: 4992 on 5638  Progress: 4993 on 5638  Progress: 4994 on 5638  Progress: 4995 on 5638  Progress: 4996 on 5638  Progress: 4997 on 5638  Progress: 4998 on 5638  Progress: 4999 on 5638  Progress: 5000 on 5638  Progress: 5001 on 5638  Progress: 5002 on 5638  Progress: 5003 on 5638  Progress: 5004 on 5638  Progress: 5005 on 5638  Progress: 5006 on 5638  Progress: 5007 on 5638  Progress: 5008 on 5638  Progress: 5009 on 5638  Progress: 5010 on 5638  Progress: 5011 on 5638  Progress: 5012 on 5638  Progress: 5013 on 5638  Progress: 5014 on 5638  Progress: 5015 on 5638  Progress: 5016 on 5638  Progress: 5017 on 5638  Progress: 5018 on 5638  Progress: 5019 on 5638  Progress: 5020 on 5638  Progress: 5021 on 5638  Progress: 5022 on 5638  Progress: 5023 on 5638  Progress: 5024 on 5638  Progress: 5025 on 5638  Progress: 5026 on 5638  Progress: 5027 on 5638  Progress: 5028 on 5638  Progress: 5029 on 5638  Progress: 5030 on 5638  Progress: 5031 on 5638  Progress: 5032 on 5638  Progress: 5033 on 5638  Progress: 5034 on 5638  Progress: 5035 on 5638  Progress: 5036 on 5638  Progress: 5037 on 5638  Progress: 5038 on 5638  Progress: 5039 on 5638  Progress: 5040 on 5638  Progress: 5041 on 5638  Progress: 5042 on 5638  Progress: 5043 on 5638  Progress: 5044 on 5638  Progress: 5045 on 5638  Progress: 5046 on 5638  Progress: 5047 on 5638  Progress: 5048 on 5638  Progress: 5049 on 5638  Progress: 5050 on 5638  Progress: 5051 on 5638  Progress: 5052 on 5638  Progress: 5053 on 5638  Progress: 5054 on 5638  Progress: 5055 on 5638  Progress: 5056 on 5638  Progress: 5057 on 5638  Progress: 5058 on 5638  Progress: 5059 on 5638  Progress: 5060 on 5638  Progress: 5061 on 5638  Progress: 5062 on 5638  Progress: 5063 on 5638  Progress: 5064 on 5638  Progress: 5065 on 5638  Progress: 5066 on 5638  Progress: 5067 on 5638  Progress: 5068 on 5638  Progress: 5069 on 5638  Progress: 5070 on 5638  Progress: 5071 on 5638  Progress: 5072 on 5638  Progress: 5073 on 5638  Progress: 5074 on 5638  Progress: 5075 on 5638  Progress: 5076 on 5638  Progress: 5077 on 5638  Progress: 5078 on 5638  Progress: 5079 on 5638  Progress: 5080 on 5638  Progress: 5081 on 5638  Progress: 5082 on 5638  Progress: 5083 on 5638  Progress: 5084 on 5638  Progress: 5085 on 5638  Progress: 5086 on 5638  Progress: 5087 on 5638  Progress: 5088 on 5638  Progress: 5089 on 5638  Progress: 5090 on 5638  Progress: 5091 on 5638  Progress: 5092 on 5638  Progress: 5093 on 5638  Progress: 5094 on 5638  Progress: 5095 on 5638  Progress: 5096 on 5638  Progress: 5097 on 5638  Progress: 5098 on 5638  Progress: 5099 on 5638  Progress: 5100 on 5638  Progress: 5101 on 5638  Progress: 5102 on 5638  Progress: 5103 on 5638  Progress: 5104 on 5638  Progress: 5105 on 5638  Progress: 5106 on 5638  Progress: 5107 on 5638  Progress: 5108 on 5638  Progress: 5109 on 5638  Progress: 5110 on 5638  Progress: 5111 on 5638  Progress: 5112 on 5638  Progress: 5113 on 5638  Progress: 5114 on 5638  Progress: 5115 on 5638  Progress: 5116 on 5638  Progress: 5117 on 5638  Progress: 5118 on 5638  Progress: 5119 on 5638  Progress: 5120 on 5638  Progress: 5121 on 5638  Progress: 5122 on 5638  Progress: 5123 on 5638  Progress: 5124 on 5638  Progress: 5125 on 5638  Progress: 5126 on 5638  Progress: 5127 on 5638  Progress: 5128 on 5638  Progress: 5129 on 5638  Progress: 5130 on 5638  Progress: 5131 on 5638  Progress: 5132 on 5638  Progress: 5133 on 5638  Progress: 5134 on 5638  Progress: 5135 on 5638  Progress: 5136 on 5638  Progress: 5137 on 5638  Progress: 5138 on 5638  Progress: 5139 on 5638  Progress: 5140 on 5638  Progress: 5141 on 5638  Progress: 5142 on 5638  Progress: 5143 on 5638  Progress: 5144 on 5638  Progress: 5145 on 5638  Progress: 5146 on 5638  Progress: 5147 on 5638  Progress: 5148 on 5638  Progress: 5149 on 5638  Progress: 5150 on 5638  Progress: 5151 on 5638  Progress: 5152 on 5638  Progress: 5153 on 5638  Progress: 5154 on 5638  Progress: 5155 on 5638  Progress: 5156 on 5638  Progress: 5157 on 5638  Progress: 5158 on 5638  Progress: 5159 on 5638  Progress: 5160 on 5638  Progress: 5161 on 5638  Progress: 5162 on 5638  Progress: 5163 on 5638  Progress: 5164 on 5638  Progress: 5165 on 5638  Progress: 5166 on 5638  Progress: 5167 on 5638  Progress: 5168 on 5638  Progress: 5169 on 5638  Progress: 5170 on 5638  Progress: 5171 on 5638  Progress: 5172 on 5638  Progress: 5173 on 5638  Progress: 5174 on 5638  Progress: 5175 on 5638  Progress: 5176 on 5638  Progress: 5177 on 5638  Progress: 5178 on 5638  Progress: 5179 on 5638  Progress: 5180 on 5638  Progress: 5181 on 5638  Progress: 5182 on 5638  Progress: 5183 on 5638  Progress: 5184 on 5638  Progress: 5185 on 5638  Progress: 5186 on 5638  Progress: 5187 on 5638  Progress: 5188 on 5638  Progress: 5189 on 5638  Progress: 5190 on 5638  Progress: 5191 on 5638  Progress: 5192 on 5638  Progress: 5193 on 5638  Progress: 5194 on 5638  Progress: 5195 on 5638  Progress: 5196 on 5638  Progress: 5197 on 5638  Progress: 5198 on 5638  Progress: 5199 on 5638  Progress: 5200 on 5638  Progress: 5201 on 5638  Progress: 5202 on 5638  Progress: 5203 on 5638  Progress: 5204 on 5638  Progress: 5205 on 5638  Progress: 5206 on 5638  Progress: 5207 on 5638  Progress: 5208 on 5638  Progress: 5209 on 5638  Progress: 5210 on 5638  Progress: 5211 on 5638  Progress: 5212 on 5638  Progress: 5213 on 5638  Progress: 5214 on 5638  Progress: 5215 on 5638  Progress: 5216 on 5638  Progress: 5217 on 5638  Progress: 5218 on 5638  Progress: 5219 on 5638  Progress: 5220 on 5638  Progress: 5221 on 5638  Progress: 5222 on 5638  Progress: 5223 on 5638  Progress: 5224 on 5638  Progress: 5225 on 5638  Progress: 5226 on 5638  Progress: 5227 on 5638  Progress: 5228 on 5638  Progress: 5229 on 5638  Progress: 5230 on 5638  Progress: 5231 on 5638  Progress: 5232 on 5638  Progress: 5233 on 5638  Progress: 5234 on 5638  Progress: 5235 on 5638  Progress: 5236 on 5638  Progress: 5237 on 5638  Progress: 5238 on 5638  Progress: 5239 on 5638  Progress: 5240 on 5638  Progress: 5241 on 5638  Progress: 5242 on 5638  Progress: 5243 on 5638  Progress: 5244 on 5638  Progress: 5245 on 5638  Progress: 5246 on 5638  Progress: 5247 on 5638  Progress: 5248 on 5638  Progress: 5249 on 5638  Progress: 5250 on 5638  Progress: 5251 on 5638  Progress: 5252 on 5638  Progress: 5253 on 5638  Progress: 5254 on 5638  Progress: 5255 on 5638  Progress: 5256 on 5638  Progress: 5257 on 5638  Progress: 5258 on 5638  Progress: 5259 on 5638  Progress: 5260 on 5638  Progress: 5261 on 5638  Progress: 5262 on 5638  Progress: 5263 on 5638  Progress: 5264 on 5638  Progress: 5265 on 5638  Progress: 5266 on 5638  Progress: 5267 on 5638  Progress: 5268 on 5638  Progress: 5269 on 5638  Progress: 5270 on 5638  Progress: 5271 on 5638  Progress: 5272 on 5638  Progress: 5273 on 5638  Progress: 5274 on 5638  Progress: 5275 on 5638  Progress: 5276 on 5638  Progress: 5277 on 5638  Progress: 5278 on 5638  Progress: 5279 on 5638  Progress: 5280 on 5638  Progress: 5281 on 5638  Progress: 5282 on 5638  Progress: 5283 on 5638  Progress: 5284 on 5638  Progress: 5285 on 5638  Progress: 5286 on 5638  Progress: 5287 on 5638  Progress: 5288 on 5638  Progress: 5289 on 5638  Progress: 5290 on 5638  Progress: 5291 on 5638  Progress: 5292 on 5638  Progress: 5293 on 5638  Progress: 5294 on 5638  Progress: 5295 on 5638  Progress: 5296 on 5638  Progress: 5297 on 5638  Progress: 5298 on 5638  Progress: 5299 on 5638  Progress: 5300 on 5638  Progress: 5301 on 5638  Progress: 5302 on 5638  Progress: 5303 on 5638  Progress: 5304 on 5638  Progress: 5305 on 5638  Progress: 5306 on 5638  Progress: 5307 on 5638  Progress: 5308 on 5638  Progress: 5309 on 5638  Progress: 5310 on 5638  Progress: 5311 on 5638  Progress: 5312 on 5638  Progress: 5313 on 5638  Progress: 5314 on 5638  Progress: 5315 on 5638  Progress: 5316 on 5638  Progress: 5317 on 5638  Progress: 5318 on 5638  Progress: 5319 on 5638  Progress: 5320 on 5638  Progress: 5321 on 5638  Progress: 5322 on 5638  Progress: 5323 on 5638  Progress: 5324 on 5638  Progress: 5325 on 5638  Progress: 5326 on 5638  Progress: 5327 on 5638  Progress: 5328 on 5638  Progress: 5329 on 5638  Progress: 5330 on 5638  Progress: 5331 on 5638  Progress: 5332 on 5638  Progress: 5333 on 5638  Progress: 5334 on 5638  Progress: 5335 on 5638  Progress: 5336 on 5638  Progress: 5337 on 5638  Progress: 5338 on 5638  Progress: 5339 on 5638  Progress: 5340 on 5638  Progress: 5341 on 5638  Progress: 5342 on 5638  Progress: 5343 on 5638  Progress: 5344 on 5638  Progress: 5345 on 5638  Progress: 5346 on 5638  Progress: 5347 on 5638  Progress: 5348 on 5638  Progress: 5349 on 5638  Progress: 5350 on 5638  Progress: 5351 on 5638  Progress: 5352 on 5638  Progress: 5353 on 5638  Progress: 5354 on 5638  Progress: 5355 on 5638  Progress: 5356 on 5638  Progress: 5357 on 5638  Progress: 5358 on 5638  Progress: 5359 on 5638  Progress: 5360 on 5638  Progress: 5361 on 5638  Progress: 5362 on 5638  Progress: 5363 on 5638  Progress: 5364 on 5638  Progress: 5365 on 5638  Progress: 5366 on 5638  Progress: 5367 on 5638  Progress: 5368 on 5638  Progress: 5369 on 5638  Progress: 5370 on 5638  Progress: 5371 on 5638  Progress: 5372 on 5638  Progress: 5373 on 5638  Progress: 5374 on 5638  Progress: 5375 on 5638  Progress: 5376 on 5638  Progress: 5377 on 5638  Progress: 5378 on 5638  Progress: 5379 on 5638  Progress: 5380 on 5638  Progress: 5381 on 5638  Progress: 5382 on 5638  Progress: 5383 on 5638  Progress: 5384 on 5638  Progress: 5385 on 5638  Progress: 5386 on 5638  Progress: 5387 on 5638  Progress: 5388 on 5638  Progress: 5389 on 5638  Progress: 5390 on 5638  Progress: 5391 on 5638  Progress: 5392 on 5638  Progress: 5393 on 5638  Progress: 5394 on 5638  Progress: 5395 on 5638  Progress: 5396 on 5638  Progress: 5397 on 5638  Progress: 5398 on 5638  Progress: 5399 on 5638  Progress: 5400 on 5638  Progress: 5401 on 5638  Progress: 5402 on 5638  Progress: 5403 on 5638  Progress: 5404 on 5638  Progress: 5405 on 5638  Progress: 5406 on 5638  Progress: 5407 on 5638  Progress: 5408 on 5638  Progress: 5409 on 5638  Progress: 5410 on 5638  Progress: 5411 on 5638  Progress: 5412 on 5638  Progress: 5413 on 5638  Progress: 5414 on 5638  Progress: 5415 on 5638  Progress: 5416 on 5638  Progress: 5417 on 5638  Progress: 5418 on 5638  Progress: 5419 on 5638  Progress: 5420 on 5638  Progress: 5421 on 5638  Progress: 5422 on 5638  Progress: 5423 on 5638  Progress: 5424 on 5638  Progress: 5425 on 5638  Progress: 5426 on 5638  Progress: 5427 on 5638  Progress: 5428 on 5638  Progress: 5429 on 5638  Progress: 5430 on 5638  Progress: 5431 on 5638  Progress: 5432 on 5638  Progress: 5433 on 5638  Progress: 5434 on 5638  Progress: 5435 on 5638  Progress: 5436 on 5638  Progress: 5437 on 5638  Progress: 5438 on 5638  Progress: 5439 on 5638  Progress: 5440 on 5638  Progress: 5441 on 5638  Progress: 5442 on 5638  Progress: 5443 on 5638  Progress: 5444 on 5638  Progress: 5445 on 5638  Progress: 5446 on 5638  Progress: 5447 on 5638  Progress: 5448 on 5638  Progress: 5449 on 5638  Progress: 5450 on 5638  Progress: 5451 on 5638  Progress: 5452 on 5638  Progress: 5453 on 5638  Progress: 5454 on 5638  Progress: 5455 on 5638  Progress: 5456 on 5638  Progress: 5457 on 5638  Progress: 5458 on 5638  Progress: 5459 on 5638  Progress: 5460 on 5638  Progress: 5461 on 5638  Progress: 5462 on 5638  Progress: 5463 on 5638  Progress: 5464 on 5638  Progress: 5465 on 5638  Progress: 5466 on 5638  Progress: 5467 on 5638  Progress: 5468 on 5638  Progress: 5469 on 5638  Progress: 5470 on 5638  Progress: 5471 on 5638  Progress: 5472 on 5638  Progress: 5473 on 5638  Progress: 5474 on 5638  Progress: 5475 on 5638  Progress: 5476 on 5638  Progress: 5477 on 5638  Progress: 5478 on 5638  Progress: 5479 on 5638  Progress: 5480 on 5638  Progress: 5481 on 5638  Progress: 5482 on 5638  Progress: 5483 on 5638  Progress: 5484 on 5638  Progress: 5485 on 5638  Progress: 5486 on 5638  Progress: 5487 on 5638  Progress: 5488 on 5638  Progress: 5489 on 5638  Progress: 5490 on 5638  Progress: 5491 on 5638  Progress: 5492 on 5638  Progress: 5493 on 5638  Progress: 5494 on 5638  Progress: 5495 on 5638  Progress: 5496 on 5638  Progress: 5497 on 5638  Progress: 5498 on 5638  Progress: 5499 on 5638  Progress: 5500 on 5638  Progress: 5501 on 5638  Progress: 5502 on 5638  Progress: 5503 on 5638  Progress: 5504 on 5638  Progress: 5505 on 5638  Progress: 5506 on 5638  Progress: 5507 on 5638  Progress: 5508 on 5638  Progress: 5509 on 5638  Progress: 5510 on 5638  Progress: 5511 on 5638  Progress: 5512 on 5638  Progress: 5513 on 5638  Progress: 5514 on 5638  Progress: 5515 on 5638  Progress: 5516 on 5638  Progress: 5517 on 5638  Progress: 5518 on 5638  Progress: 5519 on 5638  Progress: 5520 on 5638  Progress: 5521 on 5638  Progress: 5522 on 5638  Progress: 5523 on 5638  Progress: 5524 on 5638  Progress: 5525 on 5638  Progress: 5526 on 5638  Progress: 5527 on 5638  Progress: 5528 on 5638  Progress: 5529 on 5638  Progress: 5530 on 5638  Progress: 5531 on 5638  Progress: 5532 on 5638  Progress: 5533 on 5638  Progress: 5534 on 5638  Progress: 5535 on 5638  Progress: 5536 on 5638  Progress: 5537 on 5638  Progress: 5538 on 5638  Progress: 5539 on 5638  Progress: 5540 on 5638  Progress: 5541 on 5638  Progress: 5542 on 5638  Progress: 5543 on 5638  Progress: 5544 on 5638  Progress: 5545 on 5638  Progress: 5546 on 5638  Progress: 5547 on 5638  Progress: 5548 on 5638  Progress: 5549 on 5638  Progress: 5550 on 5638  Progress: 5551 on 5638  Progress: 5552 on 5638  Progress: 5553 on 5638  Progress: 5554 on 5638  Progress: 5555 on 5638  Progress: 5556 on 5638  Progress: 5557 on 5638  Progress: 5558 on 5638  Progress: 5559 on 5638  Progress: 5560 on 5638  Progress: 5561 on 5638  Progress: 5562 on 5638  Progress: 5563 on 5638  Progress: 5564 on 5638  Progress: 5565 on 5638  Progress: 5566 on 5638  Progress: 5567 on 5638  Progress: 5568 on 5638  Progress: 5569 on 5638  Progress: 5570 on 5638  Progress: 5571 on 5638  Progress: 5572 on 5638  Progress: 5573 on 5638  Progress: 5574 on 5638  Progress: 5575 on 5638  Progress: 5576 on 5638  Progress: 5577 on 5638  Progress: 5578 on 5638  Progress: 5579 on 5638  Progress: 5580 on 5638  Progress: 5581 on 5638  Progress: 5582 on 5638  Progress: 5583 on 5638  Progress: 5584 on 5638  Progress: 5585 on 5638  Progress: 5586 on 5638  Progress: 5587 on 5638  Progress: 5588 on 5638  Progress: 5589 on 5638  Progress: 5590 on 5638  Progress: 5591 on 5638  Progress: 5592 on 5638  Progress: 5593 on 5638  Progress: 5594 on 5638  Progress: 5595 on 5638  Progress: 5596 on 5638  Progress: 5597 on 5638  Progress: 5598 on 5638  Progress: 5599 on 5638  Progress: 5600 on 5638  Progress: 5601 on 5638  Progress: 5602 on 5638  Progress: 5603 on 5638  Progress: 5604 on 5638  Progress: 5605 on 5638  Progress: 5606 on 5638  Progress: 5607 on 5638  Progress: 5608 on 5638  Progress: 5609 on 5638  Progress: 5610 on 5638  Progress: 5611 on 5638  Progress: 5612 on 5638  Progress: 5613 on 5638  Progress: 5614 on 5638  Progress: 5615 on 5638  Progress: 5616 on 5638  Progress: 5617 on 5638  Progress: 5618 on 5638  Progress: 5619 on 5638  Progress: 5620 on 5638  Progress: 5621 on 5638  Progress: 5622 on 5638  Progress: 5623 on 5638  Progress: 5624 on 5638  Progress: 5625 on 5638  Progress: 5626 on 5638  Progress: 5627 on 5638  Progress: 5628 on 5638  Progress: 5629 on 5638  Progress: 5630 on 5638  Progress: 5631 on 5638  Progress: 5632 on 5638  Progress: 5633 on 5638  Progress: 5634 on 5638  Progress: 5635 on 5638  Progress: 5636 on 5638  Progress: 5637 on 5638  Progress: 5638 on 5638  
BN_wspoltworca <- BN_wspoltworca %>%
  mutate(ZA_ADNOTACJE = ifelse(czy_nazwisko==FALSE|czy_imie==FALSE,paste("UWAGA! Konflikt w danych osobowych w polach 700 i 245. Porównaj pola współtórców w formularzu z polem BN: ",X245c,sep = ""),NA)) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja,ZA_ADNOTACJE)

#7: opis współtwórców
opis_wspoltworcow <- BN_wspoltworca %>%
  select(ZA_UWAGI,funkcja,OS_IMIE,OS_NAZWISKO) %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  filter(!is.na(OS_NAZWISKO)|(is.na(OS_NAZWISKO)&grepl("et al\\.",X245c))) %>%
  mutate(jest_et_al = grepl("et al\\.",X245c),
         OS_IMIE = ifelse(OS_IMIE=="*","",as.character(OS_IMIE)),
         opis = ifelse(!is.na(OS_NAZWISKO),paste(funkcja,OS_IMIE, OS_NAZWISKO, sep = " "),""),
         opis = str_replace_all(opis," +"," "),
         opis = ifelse(opis==" ","",as.character(opis))) %>%
  select(ZA_UWAGI,opis,jest_et_al) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ", "),
         jest_et_al = paste(unique(jest_et_al),sep = "")) %>%
  ungroup() %>%
  unique() %>%
  mutate(opis = ifelse(jest_et_al==TRUE&opis=="","et al.",
                       ifelse(jest_et_al,paste(opis,"et al.",sep = " "),opis))) %>%
  select(ZA_UWAGI,opis)

#700
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
Progress:  1 on 14  Progress:  2 on 14  Progress:  3 on 14  Progress:  4 on 14  Progress:  5 on 14  Progress:  6 on 14  Progress:  7 on 14  Progress:  8 on 14  Progress:  9 on 14  Progress: 10 on 14  Progress: 11 on 14  Progress: 12 on 14  Progress: 13 on 14  Progress: 14 on 14  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
Progress:  1 on 14  Progress:  2 on 14  Progress:  3 on 14  Progress:  4 on 14  Progress:  5 on 14  Progress:  6 on 14  Progress:  7 on 14  Progress:  8 on 14  Progress:  9 on 14  Progress: 10 on 14  Progress: 11 on 14  Progress: 12 on 14  Progress: 13 on 14  Progress: 14 on 14  
marc_field_700 <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         funkcja_duza = str_to_lower(funkcja),
         opis = paste(funkcja_duza,OS_IMIE,OS_NAZWISKO, sep = " "),
         opis_duzy = paste(funkcja,OS_IMIE,OS_NAZWISKO, sep = " ")) %>%
  select(ZA_UWAGI,opis,opis_duzy) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ". "),
         opis_duzy = paste(opis_duzy,collapse = ". ")) %>%
  ungroup() %>%
  unique()

#opis współtwórców ze strefy odpowiedzialności 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$c`)

#porównanie opisu współtwórców z 245 i 700
wspoltworcy <- marc_field_700 %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  cSplit(.,"$c",sep = " ; ",direction = "long") %>%
  #ograniczanie osób ze strefy odpowiedzialności
  mutate(czy_mala = grepl(" [a-zęóąśłżźćń]|^[a-zęóąśłżźćń]|\\[[a-zęóąśłżźćń]",`$c`,ignore.case = FALSE)) %>%
  filter(czy_mala==TRUE) %>%
  select(-czy_mala) %>%
  #mutate(`$c` = gsub("^(\\[){0,1}([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])","\\1\\U\\2",perl = TRUE,`$c`)) %>%
  group_by(ZA_UWAGI) %>%
  mutate(X245 = paste(`$c`, collapse = ", ")) %>%
  select(-`$c`) %>%
  unique() %>%
  mutate(order_pbl = as.character(str_extract_all(opis,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_pbl = str_replace_all(order_pbl,"(.*?\")(.)(\".*?.)", "\\2"),
         order_bn = as.character(str_extract_all(X245,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_bn = str_replace_all(order_bn,"(.*?\")(.)(\".*?.)", "\\2"),
         X245 = str_remove(X245, "\\.$"),
         X245 = str_remove(X245, "\\["),
         X245 = str_remove(X245, "\\]"),
         order_pbl = str_remove_all(order_pbl, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         order_bn = str_remove_all(order_bn, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         to_samo = order_pbl==order_bn,
         X245 = gsub("(^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(.*)","\\U\\1\\E\\2",perl = TRUE, X245)) %>%
  left_join(.,za_jezyk_oryginalu,by="ZA_UWAGI") %>%
  mutate(czy_pl = grepl("pol",ZA_JEZYK_ORYGINALU)|is.na(ZA_JEZYK_ORYGINALU),
         decyzja = ifelse(to_samo==FALSE|czy_pl==FALSE,FALSE,TRUE))

za_opis_wspoltworcow <- wspoltworcy %>%
  mutate(za_opis_wspoltworcow = ifelse(decyzja==TRUE,as.character(X245),paste(X245,opis_duzy,sep = "#"))) %>%
  select(ZA_UWAGI,opis_duzy,za_opis_wspoltworcow) %>%
  cSplit(.,"za_opis_wspoltworcow",sep = "#",direction = "wide") %>%
  mutate(za_opis_wspoltworcow_2 = ifelse(is.na(za_opis_wspoltworcow_2),'',as.character(za_opis_wspoltworcow_2)),
         to_samo = za_opis_wspoltworcow_1==za_opis_wspoltworcow_2) %>%
  filter(to_samo==FALSE) %>%
  group_by(ZA_UWAGI) %>%
  mutate(za_opis_wspoltworcow = paste(za_opis_wspoltworcow_1,za_opis_wspoltworcow_2,sep = "#"),
         za_opis_wspoltworcow = str_remove_all(za_opis_wspoltworcow,"\\#$")) %>%
  select(ZA_UWAGI,za_opis_wspoltworcow)

opis_wspoltworcow <- opis_wspoltworcow %>%
  filter(ZA_UWAGI %notin% za_opis_wspoltworcow$ZA_UWAGI) %>%
  filter(!is.na(opis)) %>%
  rename(za_opis_wspoltworcow = opis)

za_opis_wspoltworcow <- za_opis_wspoltworcow %>%
  bind_rows(.,opis_wspoltworcow) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#8 wydanie
marc_field_250 <- data %>%
  select(ZA_UWAGI,X250)%>%
  filter(X250!="") %>%
  mutate(X250=str_replace_all(X250,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X250",sep = "~",direction = "long") %>%
  filter(X250!="") %>%
  mutate(X250=str_remove_all(X250,"^\\|")) %>%
  mutate(indicator = str_replace_all(X250,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X250,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_250)[1]))
colnames(empty_table) <-subfield_list
marc_field_250<-cbind(marc_field_250,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_250$X250 <- str_replace(marc_field_250$X250,subfield_list_char[i],"|\\1")
}
Progress: 1 on 2  Progress: 2 on 2  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_250[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_250$X250),str_replace_all(gsub(string,"\\3",marc_field_250$X250),"\\${2}.", "~"),NA)
}
Progress: 1 on 2  Progress: 2 on 2  
za_wydanie <- marc_field_250 %>%
  select(ZA_UWAGI, wydanie = `$a`) %>%
  mutate(wydanie = str_remove(wydanie," \\/$")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#9: instytucja sprawcza
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
za_instytucja <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`) %>%
  filter(!is.na(X245c)) %>%
  mutate(instytucja = ifelse(grepl("\\;",X245c),str_replace_all(X245c, "(.*?)(\\;(?!.*\\;))( )+(.*?$)","\\4"),"")) %>%
  left_join(.,BN_wspoltworca,by="ZA_UWAGI")

x <- 1:lengths(za_instytucja[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  za_instytucja$czy_nazwisko[i] <- grepl(za_instytucja$OS_NAZWISKO[i],za_instytucja$X245c[i])
  za_instytucja$czy_imie[i] <- grepl(za_instytucja$OS_IMIE[i],za_instytucja$X245c[i])
}
Progress:    1 on 8517  Progress:    2 on 8517  Progress:    3 on 8517  Progress:    4 on 8517  Progress:    5 on 8517  Progress:    6 on 8517  Progress:    7 on 8517  Progress:    8 on 8517  Progress:    9 on 8517  Progress:   10 on 8517  Progress:   11 on 8517  Progress:   12 on 8517  Progress:   13 on 8517  Progress:   14 on 8517  Progress:   15 on 8517  Progress:   16 on 8517  Progress:   17 on 8517  Progress:   18 on 8517  Progress:   19 on 8517  Progress:   20 on 8517  Progress:   21 on 8517  Progress:   22 on 8517  Progress:   23 on 8517  Progress:   24 on 8517  Progress:   25 on 8517  Progress:   26 on 8517  Progress:   27 on 8517  Progress:   28 on 8517  Progress:   29 on 8517  Progress:   30 on 8517  Progress:   31 on 8517  Progress:   32 on 8517  Progress:   33 on 8517  Progress:   34 on 8517  Progress:   35 on 8517  Progress:   36 on 8517  Progress:   37 on 8517  Progress:   38 on 8517  Progress:   39 on 8517  Progress:   40 on 8517  Progress:   41 on 8517  Progress:   42 on 8517  Progress:   43 on 8517  Progress:   44 on 8517  Progress:   45 on 8517  Progress:   46 on 8517  Progress:   47 on 8517  Progress:   48 on 8517  Progress:   49 on 8517  Progress:   50 on 8517  Progress:   51 on 8517  Progress:   52 on 8517  Progress:   53 on 8517  Progress:   54 on 8517  Progress:   55 on 8517  Progress:   56 on 8517  Progress:   57 on 8517  Progress:   58 on 8517  Progress:   59 on 8517  Progress:   60 on 8517  Progress:   61 on 8517  Progress:   62 on 8517  Progress:   63 on 8517  Progress:   64 on 8517  Progress:   65 on 8517  Progress:   66 on 8517  Progress:   67 on 8517  Progress:   68 on 8517  Progress:   69 on 8517  Progress:   70 on 8517  Progress:   71 on 8517  Progress:   72 on 8517  Progress:   73 on 8517  Progress:   74 on 8517  Progress:   75 on 8517  Progress:   76 on 8517  Progress:   77 on 8517  Progress:   78 on 8517  Progress:   79 on 8517  Progress:   80 on 8517  Progress:   81 on 8517  Progress:   82 on 8517  Progress:   83 on 8517  Progress:   84 on 8517  Progress:   85 on 8517  Progress:   86 on 8517  Progress:   87 on 8517  Progress:   88 on 8517  Progress:   89 on 8517  Progress:   90 on 8517  Progress:   91 on 8517  Progress:   92 on 8517  Progress:   93 on 8517  Progress:   94 on 8517  Progress:   95 on 8517  Progress:   96 on 8517  Progress:   97 on 8517  Progress:   98 on 8517  Progress:   99 on 8517  Progress:  100 on 8517  Progress:  101 on 8517  Progress:  102 on 8517  Progress:  103 on 8517  Progress:  104 on 8517  Progress:  105 on 8517  Progress:  106 on 8517  Progress:  107 on 8517  Progress:  108 on 8517  Progress:  109 on 8517  Progress:  110 on 8517  Progress:  111 on 8517  Progress:  112 on 8517  Progress:  113 on 8517  Progress:  114 on 8517  Progress:  115 on 8517  Progress:  116 on 8517  Progress:  117 on 8517  Progress:  118 on 8517  Progress:  119 on 8517  Progress:  120 on 8517  Progress:  121 on 8517  Progress:  122 on 8517  Progress:  123 on 8517  Progress:  124 on 8517  Progress:  125 on 8517  Progress:  126 on 8517  Progress:  127 on 8517  Progress:  128 on 8517  Progress:  129 on 8517  Progress:  130 on 8517  Progress:  131 on 8517  Progress:  132 on 8517  Progress:  133 on 8517  Progress:  134 on 8517  Progress:  135 on 8517  Progress:  136 on 8517  Progress:  137 on 8517  Progress:  138 on 8517  Progress:  139 on 8517  Progress:  140 on 8517  Progress:  141 on 8517  Progress:  142 on 8517  Progress:  143 on 8517  Progress:  144 on 8517  Progress:  145 on 8517  Progress:  146 on 8517  Progress:  147 on 8517  Progress:  148 on 8517  Progress:  149 on 8517  Progress:  150 on 8517  Progress:  151 on 8517  Progress:  152 on 8517  Progress:  153 on 8517  Progress:  154 on 8517  Progress:  155 on 8517  Progress:  156 on 8517  Progress:  157 on 8517  Progress:  158 on 8517  Progress:  159 on 8517  Progress:  160 on 8517  Progress:  161 on 8517  Progress:  162 on 8517  Progress:  163 on 8517  Progress:  164 on 8517  Progress:  165 on 8517  Progress:  166 on 8517  Progress:  167 on 8517  Progress:  168 on 8517  Progress:  169 on 8517  Progress:  170 on 8517  Progress:  171 on 8517  Progress:  172 on 8517  Progress:  173 on 8517  Progress:  174 on 8517  Progress:  175 on 8517  Progress:  176 on 8517  Progress:  177 on 8517  Progress:  178 on 8517  Progress:  179 on 8517  Progress:  180 on 8517  Progress:  181 on 8517  Progress:  182 on 8517  Progress:  183 on 8517  Progress:  184 on 8517  Progress:  185 on 8517  Progress:  186 on 8517  Progress:  187 on 8517  Progress:  188 on 8517  Progress:  189 on 8517  Progress:  190 on 8517  Progress:  191 on 8517  Progress:  192 on 8517  Progress:  193 on 8517  Progress:  194 on 8517  Progress:  195 on 8517  Progress:  196 on 8517  Progress:  197 on 8517  Progress:  198 on 8517  Progress:  199 on 8517  Progress:  200 on 8517  Progress:  201 on 8517  Progress:  202 on 8517  Progress:  203 on 8517  Progress:  204 on 8517  Progress:  205 on 8517  Progress:  206 on 8517  Progress:  207 on 8517  Progress:  208 on 8517  Progress:  209 on 8517  Progress:  210 on 8517  Progress:  211 on 8517  Progress:  212 on 8517  Progress:  213 on 8517  Progress:  214 on 8517  Progress:  215 on 8517  Progress:  216 on 8517  Progress:  217 on 8517  Progress:  218 on 8517  Progress:  219 on 8517  Progress:  220 on 8517  Progress:  221 on 8517  Progress:  222 on 8517  Progress:  223 on 8517  Progress:  224 on 8517  Progress:  225 on 8517  Progress:  226 on 8517  Progress:  227 on 8517  Progress:  228 on 8517  Progress:  229 on 8517  Progress:  230 on 8517  Progress:  231 on 8517  Progress:  232 on 8517  Progress:  233 on 8517  Progress:  234 on 8517  Progress:  235 on 8517  Progress:  236 on 8517  Progress:  237 on 8517  Progress:  238 on 8517  Progress:  239 on 8517  Progress:  240 on 8517  Progress:  241 on 8517  Progress:  242 on 8517  Progress:  243 on 8517  Progress:  244 on 8517  Progress:  245 on 8517  Progress:  246 on 8517  Progress:  247 on 8517  Progress:  248 on 8517  Progress:  249 on 8517  Progress:  250 on 8517  Progress:  251 on 8517  Progress:  252 on 8517  Progress:  253 on 8517  Progress:  254 on 8517  Progress:  255 on 8517  Progress:  256 on 8517  Progress:  257 on 8517  Progress:  258 on 8517  Progress:  259 on 8517  Progress:  260 on 8517  Progress:  261 on 8517  Progress:  262 on 8517  Progress:  263 on 8517  Progress:  264 on 8517  Progress:  265 on 8517  Progress:  266 on 8517  Progress:  267 on 8517  Progress:  268 on 8517  Progress:  269 on 8517  Progress:  270 on 8517  Progress:  271 on 8517  Progress:  272 on 8517  Progress:  273 on 8517  Progress:  274 on 8517  Progress:  275 on 8517  Progress:  276 on 8517  Progress:  277 on 8517  Progress:  278 on 8517  Progress:  279 on 8517  Progress:  280 on 8517  Progress:  281 on 8517  Progress:  282 on 8517  Progress:  283 on 8517  Progress:  284 on 8517  Progress:  285 on 8517  Progress:  286 on 8517  Progress:  287 on 8517  Progress:  288 on 8517  Progress:  289 on 8517  Progress:  290 on 8517  Progress:  291 on 8517  Progress:  292 on 8517  Progress:  293 on 8517  Progress:  294 on 8517  Progress:  295 on 8517  Progress:  296 on 8517  Progress:  297 on 8517  Progress:  298 on 8517  Progress:  299 on 8517  Progress:  300 on 8517  Progress:  301 on 8517  Progress:  302 on 8517  Progress:  303 on 8517  Progress:  304 on 8517  Progress:  305 on 8517  Progress:  306 on 8517  Progress:  307 on 8517  Progress:  308 on 8517  Progress:  309 on 8517  Progress:  310 on 8517  Progress:  311 on 8517  Progress:  312 on 8517  Progress:  313 on 8517  Progress:  314 on 8517  Progress:  315 on 8517  Progress:  316 on 8517  Progress:  317 on 8517  Progress:  318 on 8517  Progress:  319 on 8517  Progress:  320 on 8517  Progress:  321 on 8517  Progress:  322 on 8517  Progress:  323 on 8517  Progress:  324 on 8517  Progress:  325 on 8517  Progress:  326 on 8517  Progress:  327 on 8517  Progress:  328 on 8517  Progress:  329 on 8517  Progress:  330 on 8517  Progress:  331 on 8517  Progress:  332 on 8517  Progress:  333 on 8517  Progress:  334 on 8517  Progress:  335 on 8517  Progress:  336 on 8517  Progress:  337 on 8517  Progress:  338 on 8517  Progress:  339 on 8517  Progress:  340 on 8517  Progress:  341 on 8517  Progress:  342 on 8517  Progress:  343 on 8517  Progress:  344 on 8517  Progress:  345 on 8517  Progress:  346 on 8517  Progress:  347 on 8517  Progress:  348 on 8517  Progress:  349 on 8517  Progress:  350 on 8517  Progress:  351 on 8517  Progress:  352 on 8517  Progress:  353 on 8517  Progress:  354 on 8517  Progress:  355 on 8517  Progress:  356 on 8517  Progress:  357 on 8517  Progress:  358 on 8517  Progress:  359 on 8517  Progress:  360 on 8517  Progress:  361 on 8517  Progress:  362 on 8517  Progress:  363 on 8517  Progress:  364 on 8517  Progress:  365 on 8517  Progress:  366 on 8517  Progress:  367 on 8517  Progress:  368 on 8517  Progress:  369 on 8517  Progress:  370 on 8517  Progress:  371 on 8517  Progress:  372 on 8517  Progress:  373 on 8517  Progress:  374 on 8517  Progress:  375 on 8517  Progress:  376 on 8517  Progress:  377 on 8517  Progress:  378 on 8517  Progress:  379 on 8517  Progress:  380 on 8517  Progress:  381 on 8517  Progress:  382 on 8517  Progress:  383 on 8517  Progress:  384 on 8517  Progress:  385 on 8517  Progress:  386 on 8517  Progress:  387 on 8517  Progress:  388 on 8517  Progress:  389 on 8517  Progress:  390 on 8517  Progress:  391 on 8517  Progress:  392 on 8517  Progress:  393 on 8517  Progress:  394 on 8517  Progress:  395 on 8517  Progress:  396 on 8517  Progress:  397 on 8517  Progress:  398 on 8517  Progress:  399 on 8517  Progress:  400 on 8517  Progress:  401 on 8517  Progress:  402 on 8517  Progress:  403 on 8517  Progress:  404 on 8517  Progress:  405 on 8517  Progress:  406 on 8517  Progress:  407 on 8517  Progress:  408 on 8517  Progress:  409 on 8517  Progress:  410 on 8517  Progress:  411 on 8517  Progress:  412 on 8517  Progress:  413 on 8517  Progress:  414 on 8517  Progress:  415 on 8517  Progress:  416 on 8517  Progress:  417 on 8517  Progress:  418 on 8517  Progress:  419 on 8517  Progress:  420 on 8517  Progress:  421 on 8517  Progress:  422 on 8517  Progress:  423 on 8517  Progress:  424 on 8517  Progress:  425 on 8517  Progress:  426 on 8517  Progress:  427 on 8517  Progress:  428 on 8517  Progress:  429 on 8517  Progress:  430 on 8517  Progress:  431 on 8517  Progress:  432 on 8517  Progress:  433 on 8517  Progress:  434 on 8517  Progress:  435 on 8517  Progress:  436 on 8517  Progress:  437 on 8517  Progress:  438 on 8517  Progress:  439 on 8517  Progress:  440 on 8517  Progress:  441 on 8517  Progress:  442 on 8517  Progress:  443 on 8517  Progress:  444 on 8517  Progress:  445 on 8517  Progress:  446 on 8517  Progress:  447 on 8517  Progress:  448 on 8517  Progress:  449 on 8517  Progress:  450 on 8517  Progress:  451 on 8517  Progress:  452 on 8517  Progress:  453 on 8517  Progress:  454 on 8517  Progress:  455 on 8517  Progress:  456 on 8517  Progress:  457 on 8517  Progress:  458 on 8517  Progress:  459 on 8517  Progress:  460 on 8517  Progress:  461 on 8517  Progress:  462 on 8517  Progress:  463 on 8517  Progress:  464 on 8517  Progress:  465 on 8517  Progress:  466 on 8517  Progress:  467 on 8517  Progress:  468 on 8517  Progress:  469 on 8517  Progress:  470 on 8517  Progress:  471 on 8517  Progress:  472 on 8517  Progress:  473 on 8517  Progress:  474 on 8517  Progress:  475 on 8517  Progress:  476 on 8517  Progress:  477 on 8517  Progress:  478 on 8517  Progress:  479 on 8517  Progress:  480 on 8517  Progress:  481 on 8517  Progress:  482 on 8517  Progress:  483 on 8517  Progress:  484 on 8517  Progress:  485 on 8517  Progress:  486 on 8517  Progress:  487 on 8517  Progress:  488 on 8517  Progress:  489 on 8517  Progress:  490 on 8517  Progress:  491 on 8517  Progress:  492 on 8517  Progress:  493 on 8517  Progress:  494 on 8517  Progress:  495 on 8517  Progress:  496 on 8517  Progress:  497 on 8517  Progress:  498 on 8517  Progress:  499 on 8517  Progress:  500 on 8517  Progress:  501 on 8517  Progress:  502 on 8517  Progress:  503 on 8517  Progress:  504 on 8517  Progress:  505 on 8517  Progress:  506 on 8517  Progress:  507 on 8517  Progress:  508 on 8517  Progress:  509 on 8517  Progress:  510 on 8517  Progress:  511 on 8517  Progress:  512 on 8517  Progress:  513 on 8517  Progress:  514 on 8517  Progress:  515 on 8517  Progress:  516 on 8517  Progress:  517 on 8517  Progress:  518 on 8517  Progress:  519 on 8517  Progress:  520 on 8517  Progress:  521 on 8517  Progress:  522 on 8517  Progress:  523 on 8517  Progress:  524 on 8517  Progress:  525 on 8517  Progress:  526 on 8517  Progress:  527 on 8517  Progress:  528 on 8517  Progress:  529 on 8517  Progress:  530 on 8517  Progress:  531 on 8517  Progress:  532 on 8517  Progress:  533 on 8517  Progress:  534 on 8517  Progress:  535 on 8517  Progress:  536 on 8517  Progress:  537 on 8517  Progress:  538 on 8517  Progress:  539 on 8517  Progress:  540 on 8517  Progress:  541 on 8517  Progress:  542 on 8517  Progress:  543 on 8517  Progress:  544 on 8517  Progress:  545 on 8517  Progress:  546 on 8517  Progress:  547 on 8517  Progress:  548 on 8517  Progress:  549 on 8517  Progress:  550 on 8517  Progress:  551 on 8517  Progress:  552 on 8517  Progress:  553 on 8517  Progress:  554 on 8517  Progress:  555 on 8517  Progress:  556 on 8517  Progress:  557 on 8517  Progress:  558 on 8517  Progress:  559 on 8517  Progress:  560 on 8517  Progress:  561 on 8517  Progress:  562 on 8517  Progress:  563 on 8517  Progress:  564 on 8517  Progress:  565 on 8517  Progress:  566 on 8517  Progress:  567 on 8517  Progress:  568 on 8517  Progress:  569 on 8517  Progress:  570 on 8517  Progress:  571 on 8517  Progress:  572 on 8517  Progress:  573 on 8517  Progress:  574 on 8517  Progress:  575 on 8517  Progress:  576 on 8517  Progress:  577 on 8517  Progress:  578 on 8517  Progress:  579 on 8517  Progress:  580 on 8517  Progress:  581 on 8517  Progress:  582 on 8517  Progress:  583 on 8517  Progress:  584 on 8517  Progress:  585 on 8517  Progress:  586 on 8517  Progress:  587 on 8517  Progress:  588 on 8517  Progress:  589 on 8517  Progress:  590 on 8517  Progress:  591 on 8517  Progress:  592 on 8517  Progress:  593 on 8517  Progress:  594 on 8517  Progress:  595 on 8517  Progress:  596 on 8517  Progress:  597 on 8517  Progress:  598 on 8517  Progress:  599 on 8517  Progress:  600 on 8517  Progress:  601 on 8517  Progress:  602 on 8517  Progress:  603 on 8517  Progress:  604 on 8517  Progress:  605 on 8517  Progress:  606 on 8517  Progress:  607 on 8517  Progress:  608 on 8517  Progress:  609 on 8517  Progress:  610 on 8517  Progress:  611 on 8517  Progress:  612 on 8517  Progress:  613 on 8517  Progress:  614 on 8517  Progress:  615 on 8517  Progress:  616 on 8517  Progress:  617 on 8517  Progress:  618 on 8517  Progress:  619 on 8517  Progress:  620 on 8517  Progress:  621 on 8517  Progress:  622 on 8517  Progress:  623 on 8517  Progress:  624 on 8517  Progress:  625 on 8517  Progress:  626 on 8517  Progress:  627 on 8517  Progress:  628 on 8517  Progress:  629 on 8517  Progress:  630 on 8517  Progress:  631 on 8517  Progress:  632 on 8517  Progress:  633 on 8517  Progress:  634 on 8517  Progress:  635 on 8517  Progress:  636 on 8517  Progress:  637 on 8517  Progress:  638 on 8517  Progress:  639 on 8517  Progress:  640 on 8517  Progress:  641 on 8517  Progress:  642 on 8517  Progress:  643 on 8517  Progress:  644 on 8517  Progress:  645 on 8517  Progress:  646 on 8517  Progress:  647 on 8517  Progress:  648 on 8517  Progress:  649 on 8517  Progress:  650 on 8517  Progress:  651 on 8517  Progress:  652 on 8517  Progress:  653 on 8517  Progress:  654 on 8517  Progress:  655 on 8517  Progress:  656 on 8517  Progress:  657 on 8517  Progress:  658 on 8517  Progress:  659 on 8517  Progress:  660 on 8517  Progress:  661 on 8517  Progress:  662 on 8517  Progress:  663 on 8517  Progress:  664 on 8517  Progress:  665 on 8517  Progress:  666 on 8517  Progress:  667 on 8517  Progress:  668 on 8517  Progress:  669 on 8517  Progress:  670 on 8517  Progress:  671 on 8517  Progress:  672 on 8517  Progress:  673 on 8517  Progress:  674 on 8517  Progress:  675 on 8517  Progress:  676 on 8517  Progress:  677 on 8517  Progress:  678 on 8517  Progress:  679 on 8517  Progress:  680 on 8517  Progress:  681 on 8517  Progress:  682 on 8517  Progress:  683 on 8517  Progress:  684 on 8517  Progress:  685 on 8517  Progress:  686 on 8517  Progress:  687 on 8517  Progress:  688 on 8517  Progress:  689 on 8517  Progress:  690 on 8517  Progress:  691 on 8517  Progress:  692 on 8517  Progress:  693 on 8517  Progress:  694 on 8517  Progress:  695 on 8517  Progress:  696 on 8517  Progress:  697 on 8517  Progress:  698 on 8517  Progress:  699 on 8517  Progress:  700 on 8517  Progress:  701 on 8517  Progress:  702 on 8517  Progress:  703 on 8517  Progress:  704 on 8517  Progress:  705 on 8517  Progress:  706 on 8517  Progress:  707 on 8517  Progress:  708 on 8517  Progress:  709 on 8517  Progress:  710 on 8517  Progress:  711 on 8517  Progress:  712 on 8517  Progress:  713 on 8517  Progress:  714 on 8517  Progress:  715 on 8517  Progress:  716 on 8517  Progress:  717 on 8517  Progress:  718 on 8517  Progress:  719 on 8517  Progress:  720 on 8517  Progress:  721 on 8517  Progress:  722 on 8517  Progress:  723 on 8517  Progress:  724 on 8517  Progress:  725 on 8517  Progress:  726 on 8517  Progress:  727 on 8517  Progress:  728 on 8517  Progress:  729 on 8517  Progress:  730 on 8517  Progress:  731 on 8517  Progress:  732 on 8517  Progress:  733 on 8517  Progress:  734 on 8517  Progress:  735 on 8517  Progress:  736 on 8517  Progress:  737 on 8517  Progress:  738 on 8517  Progress:  739 on 8517  Progress:  740 on 8517  Progress:  741 on 8517  Progress:  742 on 8517  Progress:  743 on 8517  Progress:  744 on 8517  Progress:  745 on 8517  Progress:  746 on 8517  Progress:  747 on 8517  Progress:  748 on 8517  Progress:  749 on 8517  Progress:  750 on 8517  Progress:  751 on 8517  Progress:  752 on 8517  Progress:  753 on 8517  Progress:  754 on 8517  Progress:  755 on 8517  Progress:  756 on 8517  Progress:  757 on 8517  Progress:  758 on 8517  Progress:  759 on 8517  Progress:  760 on 8517  Progress:  761 on 8517  Progress:  762 on 8517  Progress:  763 on 8517  Progress:  764 on 8517  Progress:  765 on 8517  Progress:  766 on 8517  Progress:  767 on 8517  Progress:  768 on 8517  Progress:  769 on 8517  Progress:  770 on 8517  Progress:  771 on 8517  Progress:  772 on 8517  Progress:  773 on 8517  Progress:  774 on 8517  Progress:  775 on 8517  Progress:  776 on 8517  Progress:  777 on 8517  Progress:  778 on 8517  Progress:  779 on 8517  Progress:  780 on 8517  Progress:  781 on 8517  Progress:  782 on 8517  Progress:  783 on 8517  Progress:  784 on 8517  Progress:  785 on 8517  Progress:  786 on 8517  Progress:  787 on 8517  Progress:  788 on 8517  Progress:  789 on 8517  Progress:  790 on 8517  Progress:  791 on 8517  Progress:  792 on 8517  Progress:  793 on 8517  Progress:  794 on 8517  Progress:  795 on 8517  Progress:  796 on 8517  Progress:  797 on 8517  Progress:  798 on 8517  Progress:  799 on 8517  Progress:  800 on 8517  Progress:  801 on 8517  Progress:  802 on 8517  Progress:  803 on 8517  Progress:  804 on 8517  Progress:  805 on 8517  Progress:  806 on 8517  Progress:  807 on 8517  Progress:  808 on 8517  Progress:  809 on 8517  Progress:  810 on 8517  Progress:  811 on 8517  Progress:  812 on 8517  Progress:  813 on 8517  Progress:  814 on 8517  Progress:  815 on 8517  Progress:  816 on 8517  Progress:  817 on 8517  Progress:  818 on 8517  Progress:  819 on 8517  Progress:  820 on 8517  Progress:  821 on 8517  Progress:  822 on 8517  Progress:  823 on 8517  Progress:  824 on 8517  Progress:  825 on 8517  Progress:  826 on 8517  Progress:  827 on 8517  Progress:  828 on 8517  Progress:  829 on 8517  Progress:  830 on 8517  Progress:  831 on 8517  Progress:  832 on 8517  Progress:  833 on 8517  Progress:  834 on 8517  Progress:  835 on 8517  Progress:  836 on 8517  Progress:  837 on 8517  Progress:  838 on 8517  Progress:  839 on 8517  Progress:  840 on 8517  Progress:  841 on 8517  Progress:  842 on 8517  Progress:  843 on 8517  Progress:  844 on 8517  Progress:  845 on 8517  Progress:  846 on 8517  Progress:  847 on 8517  Progress:  848 on 8517  Progress:  849 on 8517  Progress:  850 on 8517  Progress:  851 on 8517  Progress:  852 on 8517  Progress:  853 on 8517  Progress:  854 on 8517  Progress:  855 on 8517  Progress:  856 on 8517  Progress:  857 on 8517  Progress:  858 on 8517  Progress:  859 on 8517  Progress:  860 on 8517  Progress:  861 on 8517  Progress:  862 on 8517  Progress:  863 on 8517  Progress:  864 on 8517  Progress:  865 on 8517  Progress:  866 on 8517  Progress:  867 on 8517  Progress:  868 on 8517  Progress:  869 on 8517  Progress:  870 on 8517  Progress:  871 on 8517  Progress:  872 on 8517  Progress:  873 on 8517  Progress:  874 on 8517  Progress:  875 on 8517  Progress:  876 on 8517  Progress:  877 on 8517  Progress:  878 on 8517  Progress:  879 on 8517  Progress:  880 on 8517  Progress:  881 on 8517  Progress:  882 on 8517  Progress:  883 on 8517  Progress:  884 on 8517  Progress:  885 on 8517  Progress:  886 on 8517  Progress:  887 on 8517  Progress:  888 on 8517  Progress:  889 on 8517  Progress:  890 on 8517  Progress:  891 on 8517  Progress:  892 on 8517  Progress:  893 on 8517  Progress:  894 on 8517  Progress:  895 on 8517  Progress:  896 on 8517  Progress:  897 on 8517  Progress:  898 on 8517  Progress:  899 on 8517  Progress:  900 on 8517  Progress:  901 on 8517  Progress:  902 on 8517  Progress:  903 on 8517  Progress:  904 on 8517  Progress:  905 on 8517  Progress:  906 on 8517  Progress:  907 on 8517  Progress:  908 on 8517  Progress:  909 on 8517  Progress:  910 on 8517  Progress:  911 on 8517  Progress:  912 on 8517  Progress:  913 on 8517  Progress:  914 on 8517  Progress:  915 on 8517  Progress:  916 on 8517  Progress:  917 on 8517  Progress:  918 on 8517  Progress:  919 on 8517  Progress:  920 on 8517  Progress:  921 on 8517  Progress:  922 on 8517  Progress:  923 on 8517  Progress:  924 on 8517  Progress:  925 on 8517  Progress:  926 on 8517  Progress:  927 on 8517  Progress:  928 on 8517  Progress:  929 on 8517  Progress:  930 on 8517  Progress:  931 on 8517  Progress:  932 on 8517  Progress:  933 on 8517  Progress:  934 on 8517  Progress:  935 on 8517  Progress:  936 on 8517  Progress:  937 on 8517  Progress:  938 on 8517  Progress:  939 on 8517  Progress:  940 on 8517  Progress:  941 on 8517  Progress:  942 on 8517  Progress:  943 on 8517  Progress:  944 on 8517  Progress:  945 on 8517  Progress:  946 on 8517  Progress:  947 on 8517  Progress:  948 on 8517  Progress:  949 on 8517  Progress:  950 on 8517  Progress:  951 on 8517  Progress:  952 on 8517  Progress:  953 on 8517  Progress:  954 on 8517  Progress:  955 on 8517  Progress:  956 on 8517  Progress:  957 on 8517  Progress:  958 on 8517  Progress:  959 on 8517  Progress:  960 on 8517  Progress:  961 on 8517  Progress:  962 on 8517  Progress:  963 on 8517  Progress:  964 on 8517  Progress:  965 on 8517  Progress:  966 on 8517  Progress:  967 on 8517  Progress:  968 on 8517  Progress:  969 on 8517  Progress:  970 on 8517  Progress:  971 on 8517  Progress:  972 on 8517  Progress:  973 on 8517  Progress:  974 on 8517  Progress:  975 on 8517  Progress:  976 on 8517  Progress:  977 on 8517  Progress:  978 on 8517  Progress:  979 on 8517  Progress:  980 on 8517  Progress:  981 on 8517  Progress:  982 on 8517  Progress:  983 on 8517  Progress:  984 on 8517  Progress:  985 on 8517  Progress:  986 on 8517  Progress:  987 on 8517  Progress:  988 on 8517  Progress:  989 on 8517  Progress:  990 on 8517  Progress:  991 on 8517  Progress:  992 on 8517  Progress:  993 on 8517  Progress:  994 on 8517  Progress:  995 on 8517  Progress:  996 on 8517  Progress:  997 on 8517  Progress:  998 on 8517  Progress:  999 on 8517  Progress: 1000 on 8517  Progress: 1001 on 8517  Progress: 1002 on 8517  Progress: 1003 on 8517  Progress: 1004 on 8517  Progress: 1005 on 8517  Progress: 1006 on 8517  Progress: 1007 on 8517  Progress: 1008 on 8517  Progress: 1009 on 8517  Progress: 1010 on 8517  Progress: 1011 on 8517  Progress: 1012 on 8517  Progress: 1013 on 8517  Progress: 1014 on 8517  Progress: 1015 on 8517  Progress: 1016 on 8517  Progress: 1017 on 8517  Progress: 1018 on 8517  Progress: 1019 on 8517  Progress: 1020 on 8517  Progress: 1021 on 8517  Progress: 1022 on 8517  Progress: 1023 on 8517  Progress: 1024 on 8517  Progress: 1025 on 8517  Progress: 1026 on 8517  Progress: 1027 on 8517  Progress: 1028 on 8517  Progress: 1029 on 8517  Progress: 1030 on 8517  Progress: 1031 on 8517  Progress: 1032 on 8517  Progress: 1033 on 8517  Progress: 1034 on 8517  Progress: 1035 on 8517  Progress: 1036 on 8517  Progress: 1037 on 8517  Progress: 1038 on 8517  Progress: 1039 on 8517  Progress: 1040 on 8517  Progress: 1041 on 8517  Progress: 1042 on 8517  Progress: 1043 on 8517  Progress: 1044 on 8517  Progress: 1045 on 8517  Progress: 1046 on 8517  Progress: 1047 on 8517  Progress: 1048 on 8517  Progress: 1049 on 8517  Progress: 1050 on 8517  Progress: 1051 on 8517  Progress: 1052 on 8517  Progress: 1053 on 8517  Progress: 1054 on 8517  Progress: 1055 on 8517  Progress: 1056 on 8517  Progress: 1057 on 8517  Progress: 1058 on 8517  Progress: 1059 on 8517  Progress: 1060 on 8517  Progress: 1061 on 8517  Progress: 1062 on 8517  Progress: 1063 on 8517  Progress: 1064 on 8517  Progress: 1065 on 8517  Progress: 1066 on 8517  Progress: 1067 on 8517  Progress: 1068 on 8517  Progress: 1069 on 8517  Progress: 1070 on 8517  Progress: 1071 on 8517  Progress: 1072 on 8517  Progress: 1073 on 8517  Progress: 1074 on 8517  Progress: 1075 on 8517  Progress: 1076 on 8517  Progress: 1077 on 8517  Progress: 1078 on 8517  Progress: 1079 on 8517  Progress: 1080 on 8517  Progress: 1081 on 8517  Progress: 1082 on 8517  Progress: 1083 on 8517  Progress: 1084 on 8517  Progress: 1085 on 8517  Progress: 1086 on 8517  Progress: 1087 on 8517  Progress: 1088 on 8517  Progress: 1089 on 8517  Progress: 1090 on 8517  Progress: 1091 on 8517  Progress: 1092 on 8517  Progress: 1093 on 8517  Progress: 1094 on 8517  Progress: 1095 on 8517  Progress: 1096 on 8517  Progress: 1097 on 8517  Progress: 1098 on 8517  Progress: 1099 on 8517  Progress: 1100 on 8517  Progress: 1101 on 8517  Progress: 1102 on 8517  Progress: 1103 on 8517  Progress: 1104 on 8517  Progress: 1105 on 8517  Progress: 1106 on 8517  Progress: 1107 on 8517  Progress: 1108 on 8517  Progress: 1109 on 8517  Progress: 1110 on 8517  Progress: 1111 on 8517  Progress: 1112 on 8517  Progress: 1113 on 8517  Progress: 1114 on 8517  Progress: 1115 on 8517  Progress: 1116 on 8517  Progress: 1117 on 8517  Progress: 1118 on 8517  Progress: 1119 on 8517  Progress: 1120 on 8517  Progress: 1121 on 8517  Progress: 1122 on 8517  Progress: 1123 on 8517  Progress: 1124 on 8517  Progress: 1125 on 8517  Progress: 1126 on 8517  Progress: 1127 on 8517  Progress: 1128 on 8517  Progress: 1129 on 8517  Progress: 1130 on 8517  Progress: 1131 on 8517  Progress: 1132 on 8517  Progress: 1133 on 8517  Progress: 1134 on 8517  Progress: 1135 on 8517  Progress: 1136 on 8517  Progress: 1137 on 8517  Progress: 1138 on 8517  Progress: 1139 on 8517  Progress: 1140 on 8517  Progress: 1141 on 8517  Progress: 1142 on 8517  Progress: 1143 on 8517  Progress: 1144 on 8517  Progress: 1145 on 8517  Progress: 1146 on 8517  Progress: 1147 on 8517  Progress: 1148 on 8517  Progress: 1149 on 8517  Progress: 1150 on 8517  Progress: 1151 on 8517  Progress: 1152 on 8517  Progress: 1153 on 8517  Progress: 1154 on 8517  Progress: 1155 on 8517  Progress: 1156 on 8517  Progress: 1157 on 8517  Progress: 1158 on 8517  Progress: 1159 on 8517  Progress: 1160 on 8517  Progress: 1161 on 8517  Progress: 1162 on 8517  Progress: 1163 on 8517  Progress: 1164 on 8517  Progress: 1165 on 8517  Progress: 1166 on 8517  Progress: 1167 on 8517  Progress: 1168 on 8517  Progress: 1169 on 8517  Progress: 1170 on 8517  Progress: 1171 on 8517  Progress: 1172 on 8517  Progress: 1173 on 8517  Progress: 1174 on 8517  Progress: 1175 on 8517  Progress: 1176 on 8517  Progress: 1177 on 8517  Progress: 1178 on 8517  Progress: 1179 on 8517  Progress: 1180 on 8517  Progress: 1181 on 8517  Progress: 1182 on 8517  Progress: 1183 on 8517  Progress: 1184 on 8517  Progress: 1185 on 8517  Progress: 1186 on 8517  Progress: 1187 on 8517  Progress: 1188 on 8517  Progress: 1189 on 8517  Progress: 1190 on 8517  Progress: 1191 on 8517  Progress: 1192 on 8517  Progress: 1193 on 8517  Progress: 1194 on 8517  Progress: 1195 on 8517  Progress: 1196 on 8517  Progress: 1197 on 8517  Progress: 1198 on 8517  Progress: 1199 on 8517  Progress: 1200 on 8517  Progress: 1201 on 8517  Progress: 1202 on 8517  Progress: 1203 on 8517  Progress: 1204 on 8517  Progress: 1205 on 8517  Progress: 1206 on 8517  Progress: 1207 on 8517  Progress: 1208 on 8517  Progress: 1209 on 8517  Progress: 1210 on 8517  Progress: 1211 on 8517  Progress: 1212 on 8517  Progress: 1213 on 8517  Progress: 1214 on 8517  Progress: 1215 on 8517  Progress: 1216 on 8517  Progress: 1217 on 8517  Progress: 1218 on 8517  Progress: 1219 on 8517  Progress: 1220 on 8517  Progress: 1221 on 8517  Progress: 1222 on 8517  Progress: 1223 on 8517  Progress: 1224 on 8517  Progress: 1225 on 8517  Progress: 1226 on 8517  Progress: 1227 on 8517  Progress: 1228 on 8517  Progress: 1229 on 8517  Progress: 1230 on 8517  Progress: 1231 on 8517  Progress: 1232 on 8517  Progress: 1233 on 8517  Progress: 1234 on 8517  Progress: 1235 on 8517  Progress: 1236 on 8517  Progress: 1237 on 8517  Progress: 1238 on 8517  Progress: 1239 on 8517  Progress: 1240 on 8517  Progress: 1241 on 8517  Progress: 1242 on 8517  Progress: 1243 on 8517  Progress: 1244 on 8517  Progress: 1245 on 8517  Progress: 1246 on 8517  Progress: 1247 on 8517  Progress: 1248 on 8517  Progress: 1249 on 8517  Progress: 1250 on 8517  Progress: 1251 on 8517  Progress: 1252 on 8517  Progress: 1253 on 8517  Progress: 1254 on 8517  Progress: 1255 on 8517  Progress: 1256 on 8517  Progress: 1257 on 8517  Progress: 1258 on 8517  Progress: 1259 on 8517  Progress: 1260 on 8517  Progress: 1261 on 8517  Progress: 1262 on 8517  Progress: 1263 on 8517  Progress: 1264 on 8517  Progress: 1265 on 8517  Progress: 1266 on 8517  Progress: 1267 on 8517  Progress: 1268 on 8517  Progress: 1269 on 8517  Progress: 1270 on 8517  Progress: 1271 on 8517  Progress: 1272 on 8517  Progress: 1273 on 8517  Progress: 1274 on 8517  Progress: 1275 on 8517  Progress: 1276 on 8517  Progress: 1277 on 8517  Progress: 1278 on 8517  Progress: 1279 on 8517  Progress: 1280 on 8517  Progress: 1281 on 8517  Progress: 1282 on 8517  Progress: 1283 on 8517  Progress: 1284 on 8517  Progress: 1285 on 8517  Progress: 1286 on 8517  Progress: 1287 on 8517  Progress: 1288 on 8517  Progress: 1289 on 8517  Progress: 1290 on 8517  Progress: 1291 on 8517  Progress: 1292 on 8517  Progress: 1293 on 8517  Progress: 1294 on 8517  Progress: 1295 on 8517  Progress: 1296 on 8517  Progress: 1297 on 8517  Progress: 1298 on 8517  Progress: 1299 on 8517  Progress: 1300 on 8517  Progress: 1301 on 8517  Progress: 1302 on 8517  Progress: 1303 on 8517  Progress: 1304 on 8517  Progress: 1305 on 8517  Progress: 1306 on 8517  Progress: 1307 on 8517  Progress: 1308 on 8517  Progress: 1309 on 8517  Progress: 1310 on 8517  Progress: 1311 on 8517  Progress: 1312 on 8517  Progress: 1313 on 8517  Progress: 1314 on 8517  Progress: 1315 on 8517  Progress: 1316 on 8517  Progress: 1317 on 8517  Progress: 1318 on 8517  Progress: 1319 on 8517  Progress: 1320 on 8517  Progress: 1321 on 8517  Progress: 1322 on 8517  Progress: 1323 on 8517  Progress: 1324 on 8517  Progress: 1325 on 8517  Progress: 1326 on 8517  Progress: 1327 on 8517  Progress: 1328 on 8517  Progress: 1329 on 8517  Progress: 1330 on 8517  Progress: 1331 on 8517  Progress: 1332 on 8517  Progress: 1333 on 8517  Progress: 1334 on 8517  Progress: 1335 on 8517  Progress: 1336 on 8517  Progress: 1337 on 8517  Progress: 1338 on 8517  Progress: 1339 on 8517  Progress: 1340 on 8517  Progress: 1341 on 8517  Progress: 1342 on 8517  Progress: 1343 on 8517  Progress: 1344 on 8517  Progress: 1345 on 8517  Progress: 1346 on 8517  Progress: 1347 on 8517  Progress: 1348 on 8517  Progress: 1349 on 8517  Progress: 1350 on 8517  Progress: 1351 on 8517  Progress: 1352 on 8517  Progress: 1353 on 8517  Progress: 1354 on 8517  Progress: 1355 on 8517  Progress: 1356 on 8517  Progress: 1357 on 8517  Progress: 1358 on 8517  Progress: 1359 on 8517  Progress: 1360 on 8517  Progress: 1361 on 8517  Progress: 1362 on 8517  Progress: 1363 on 8517  Progress: 1364 on 8517  Progress: 1365 on 8517  Progress: 1366 on 8517  Progress: 1367 on 8517  Progress: 1368 on 8517  Progress: 1369 on 8517  Progress: 1370 on 8517  Progress: 1371 on 8517  Progress: 1372 on 8517  Progress: 1373 on 8517  Progress: 1374 on 8517  Progress: 1375 on 8517  Progress: 1376 on 8517  Progress: 1377 on 8517  Progress: 1378 on 8517  Progress: 1379 on 8517  Progress: 1380 on 8517  Progress: 1381 on 8517  Progress: 1382 on 8517  Progress: 1383 on 8517  Progress: 1384 on 8517  Progress: 1385 on 8517  Progress: 1386 on 8517  Progress: 1387 on 8517  Progress: 1388 on 8517  Progress: 1389 on 8517  Progress: 1390 on 8517  Progress: 1391 on 8517  Progress: 1392 on 8517  Progress: 1393 on 8517  Progress: 1394 on 8517  Progress: 1395 on 8517  Progress: 1396 on 8517  Progress: 1397 on 8517  Progress: 1398 on 8517  Progress: 1399 on 8517  Progress: 1400 on 8517  Progress: 1401 on 8517  Progress: 1402 on 8517  Progress: 1403 on 8517  Progress: 1404 on 8517  Progress: 1405 on 8517  Progress: 1406 on 8517  Progress: 1407 on 8517  Progress: 1408 on 8517  Progress: 1409 on 8517  Progress: 1410 on 8517  Progress: 1411 on 8517  Progress: 1412 on 8517  Progress: 1413 on 8517  Progress: 1414 on 8517  Progress: 1415 on 8517  Progress: 1416 on 8517  Progress: 1417 on 8517  Progress: 1418 on 8517  Progress: 1419 on 8517  Progress: 1420 on 8517  Progress: 1421 on 8517  Progress: 1422 on 8517  Progress: 1423 on 8517  Progress: 1424 on 8517  Progress: 1425 on 8517  Progress: 1426 on 8517  Progress: 1427 on 8517  Progress: 1428 on 8517  Progress: 1429 on 8517  Progress: 1430 on 8517  Progress: 1431 on 8517  Progress: 1432 on 8517  Progress: 1433 on 8517  Progress: 1434 on 8517  Progress: 1435 on 8517  Progress: 1436 on 8517  Progress: 1437 on 8517  Progress: 1438 on 8517  Progress: 1439 on 8517  Progress: 1440 on 8517  Progress: 1441 on 8517  Progress: 1442 on 8517  Progress: 1443 on 8517  Progress: 1444 on 8517  Progress: 1445 on 8517  Progress: 1446 on 8517  Progress: 1447 on 8517  Progress: 1448 on 8517  Progress: 1449 on 8517  Progress: 1450 on 8517  Progress: 1451 on 8517  Progress: 1452 on 8517  Progress: 1453 on 8517  Progress: 1454 on 8517  Progress: 1455 on 8517  Progress: 1456 on 8517  Progress: 1457 on 8517  Progress: 1458 on 8517  Progress: 1459 on 8517  Progress: 1460 on 8517  Progress: 1461 on 8517  Progress: 1462 on 8517  Progress: 1463 on 8517  Progress: 1464 on 8517  Progress: 1465 on 8517  Progress: 1466 on 8517  Progress: 1467 on 8517  Progress: 1468 on 8517  Progress: 1469 on 8517  Progress: 1470 on 8517  Progress: 1471 on 8517  Progress: 1472 on 8517  Progress: 1473 on 8517  Progress: 1474 on 8517  Progress: 1475 on 8517  Progress: 1476 on 8517  Progress: 1477 on 8517  Progress: 1478 on 8517  Progress: 1479 on 8517  Progress: 1480 on 8517  Progress: 1481 on 8517  Progress: 1482 on 8517  Progress: 1483 on 8517  Progress: 1484 on 8517  Progress: 1485 on 8517  Progress: 1486 on 8517  Progress: 1487 on 8517  Progress: 1488 on 8517  Progress: 1489 on 8517  Progress: 1490 on 8517  Progress: 1491 on 8517  Progress: 1492 on 8517  Progress: 1493 on 8517  Progress: 1494 on 8517  Progress: 1495 on 8517  Progress: 1496 on 8517  Progress: 1497 on 8517  Progress: 1498 on 8517  Progress: 1499 on 8517  Progress: 1500 on 8517  Progress: 1501 on 8517  Progress: 1502 on 8517  Progress: 1503 on 8517  Progress: 1504 on 8517  Progress: 1505 on 8517  Progress: 1506 on 8517  Progress: 1507 on 8517  Progress: 1508 on 8517  Progress: 1509 on 8517  Progress: 1510 on 8517  Progress: 1511 on 8517  Progress: 1512 on 8517  Progress: 1513 on 8517  Progress: 1514 on 8517  Progress: 1515 on 8517  Progress: 1516 on 8517  Progress: 1517 on 8517  Progress: 1518 on 8517  Progress: 1519 on 8517  Progress: 1520 on 8517  Progress: 1521 on 8517  Progress: 1522 on 8517  Progress: 1523 on 8517  Progress: 1524 on 8517  Progress: 1525 on 8517  Progress: 1526 on 8517  Progress: 1527 on 8517  Progress: 1528 on 8517  Progress: 1529 on 8517  Progress: 1530 on 8517  Progress: 1531 on 8517  Progress: 1532 on 8517  Progress: 1533 on 8517  Progress: 1534 on 8517  Progress: 1535 on 8517  Progress: 1536 on 8517  Progress: 1537 on 8517  Progress: 1538 on 8517  Progress: 1539 on 8517  Progress: 1540 on 8517  Progress: 1541 on 8517  Progress: 1542 on 8517  Progress: 1543 on 8517  Progress: 1544 on 8517  Progress: 1545 on 8517  Progress: 1546 on 8517  Progress: 1547 on 8517  Progress: 1548 on 8517  Progress: 1549 on 8517  Progress: 1550 on 8517  Progress: 1551 on 8517  Progress: 1552 on 8517  Progress: 1553 on 8517  Progress: 1554 on 8517  Progress: 1555 on 8517  Progress: 1556 on 8517  Progress: 1557 on 8517  Progress: 1558 on 8517  Progress: 1559 on 8517  Progress: 1560 on 8517  Progress: 1561 on 8517  Progress: 1562 on 8517  Progress: 1563 on 8517  Progress: 1564 on 8517  Progress: 1565 on 8517  Progress: 1566 on 8517  Progress: 1567 on 8517  Progress: 1568 on 8517  Progress: 1569 on 8517  Progress: 1570 on 8517  Progress: 1571 on 8517  Progress: 1572 on 8517  Progress: 1573 on 8517  Progress: 1574 on 8517  Progress: 1575 on 8517  Progress: 1576 on 8517  Progress: 1577 on 8517  Progress: 1578 on 8517  Progress: 1579 on 8517  Progress: 1580 on 8517  Progress: 1581 on 8517  Progress: 1582 on 8517  Progress: 1583 on 8517  Progress: 1584 on 8517  Progress: 1585 on 8517  Progress: 1586 on 8517  Progress: 1587 on 8517  Progress: 1588 on 8517  Progress: 1589 on 8517  Progress: 1590 on 8517  Progress: 1591 on 8517  Progress: 1592 on 8517  Progress: 1593 on 8517  Progress: 1594 on 8517  Progress: 1595 on 8517  Progress: 1596 on 8517  Progress: 1597 on 8517  Progress: 1598 on 8517  Progress: 1599 on 8517  Progress: 1600 on 8517  Progress: 1601 on 8517  Progress: 1602 on 8517  Progress: 1603 on 8517  Progress: 1604 on 8517  Progress: 1605 on 8517  Progress: 1606 on 8517  Progress: 1607 on 8517  Progress: 1608 on 8517  Progress: 1609 on 8517  Progress: 1610 on 8517  Progress: 1611 on 8517  Progress: 1612 on 8517  Progress: 1613 on 8517  Progress: 1614 on 8517  Progress: 1615 on 8517  Progress: 1616 on 8517  Progress: 1617 on 8517  Progress: 1618 on 8517  Progress: 1619 on 8517  Progress: 1620 on 8517  Progress: 1621 on 8517  Progress: 1622 on 8517  Progress: 1623 on 8517  Progress: 1624 on 8517  Progress: 1625 on 8517  Progress: 1626 on 8517  Progress: 1627 on 8517  Progress: 1628 on 8517  Progress: 1629 on 8517  Progress: 1630 on 8517  Progress: 1631 on 8517  Progress: 1632 on 8517  Progress: 1633 on 8517  Progress: 1634 on 8517  Progress: 1635 on 8517  Progress: 1636 on 8517  Progress: 1637 on 8517  Progress: 1638 on 8517  Progress: 1639 on 8517  Progress: 1640 on 8517  Progress: 1641 on 8517  Progress: 1642 on 8517  Progress: 1643 on 8517  Progress: 1644 on 8517  Progress: 1645 on 8517  Progress: 1646 on 8517  Progress: 1647 on 8517  Progress: 1648 on 8517  Progress: 1649 on 8517  Progress: 1650 on 8517  Progress: 1651 on 8517  Progress: 1652 on 8517  Progress: 1653 on 8517  Progress: 1654 on 8517  Progress: 1655 on 8517  Progress: 1656 on 8517  Progress: 1657 on 8517  Progress: 1658 on 8517  Progress: 1659 on 8517  Progress: 1660 on 8517  Progress: 1661 on 8517  Progress: 1662 on 8517  Progress: 1663 on 8517  Progress: 1664 on 8517  Progress: 1665 on 8517  Progress: 1666 on 8517  Progress: 1667 on 8517  Progress: 1668 on 8517  Progress: 1669 on 8517  Progress: 1670 on 8517  Progress: 1671 on 8517  Progress: 1672 on 8517  Progress: 1673 on 8517  Progress: 1674 on 8517  Progress: 1675 on 8517  Progress: 1676 on 8517  Progress: 1677 on 8517  Progress: 1678 on 8517  Progress: 1679 on 8517  Progress: 1680 on 8517  Progress: 1681 on 8517  Progress: 1682 on 8517  Progress: 1683 on 8517  Progress: 1684 on 8517  Progress: 1685 on 8517  Progress: 1686 on 8517  Progress: 1687 on 8517  Progress: 1688 on 8517  Progress: 1689 on 8517  Progress: 1690 on 8517  Progress: 1691 on 8517  Progress: 1692 on 8517  Progress: 1693 on 8517  Progress: 1694 on 8517  Progress: 1695 on 8517  Progress: 1696 on 8517  Progress: 1697 on 8517  Progress: 1698 on 8517  Progress: 1699 on 8517  Progress: 1700 on 8517  Progress: 1701 on 8517  Progress: 1702 on 8517  Progress: 1703 on 8517  Progress: 1704 on 8517  Progress: 1705 on 8517  Progress: 1706 on 8517  Progress: 1707 on 8517  Progress: 1708 on 8517  Progress: 1709 on 8517  Progress: 1710 on 8517  Progress: 1711 on 8517  Progress: 1712 on 8517  Progress: 1713 on 8517  Progress: 1714 on 8517  Progress: 1715 on 8517  Progress: 1716 on 8517  Progress: 1717 on 8517  Progress: 1718 on 8517  Progress: 1719 on 8517  Progress: 1720 on 8517  Progress: 1721 on 8517  Progress: 1722 on 8517  Progress: 1723 on 8517  Progress: 1724 on 8517  Progress: 1725 on 8517  Progress: 1726 on 8517  Progress: 1727 on 8517  Progress: 1728 on 8517  Progress: 1729 on 8517  Progress: 1730 on 8517  Progress: 1731 on 8517  Progress: 1732 on 8517  Progress: 1733 on 8517  Progress: 1734 on 8517  Progress: 1735 on 8517  Progress: 1736 on 8517  Progress: 1737 on 8517  Progress: 1738 on 8517  Progress: 1739 on 8517  Progress: 1740 on 8517  Progress: 1741 on 8517  Progress: 1742 on 8517  Progress: 1743 on 8517  Progress: 1744 on 8517  Progress: 1745 on 8517  Progress: 1746 on 8517  Progress: 1747 on 8517  Progress: 1748 on 8517  Progress: 1749 on 8517  Progress: 1750 on 8517  Progress: 1751 on 8517  Progress: 1752 on 8517  Progress: 1753 on 8517  Progress: 1754 on 8517  Progress: 1755 on 8517  Progress: 1756 on 8517  Progress: 1757 on 8517  Progress: 1758 on 8517  Progress: 1759 on 8517  Progress: 1760 on 8517  Progress: 1761 on 8517  Progress: 1762 on 8517  Progress: 1763 on 8517  Progress: 1764 on 8517  Progress: 1765 on 8517  Progress: 1766 on 8517  Progress: 1767 on 8517  Progress: 1768 on 8517  Progress: 1769 on 8517  Progress: 1770 on 8517  Progress: 1771 on 8517  Progress: 1772 on 8517  Progress: 1773 on 8517  Progress: 1774 on 8517  Progress: 1775 on 8517  Progress: 1776 on 8517  Progress: 1777 on 8517  Progress: 1778 on 8517  Progress: 1779 on 8517  Progress: 1780 on 8517  Progress: 1781 on 8517  Progress: 1782 on 8517  Progress: 1783 on 8517  Progress: 1784 on 8517  Progress: 1785 on 8517  Progress: 1786 on 8517  Progress: 1787 on 8517  Progress: 1788 on 8517  Progress: 1789 on 8517  Progress: 1790 on 8517  Progress: 1791 on 8517  Progress: 1792 on 8517  Progress: 1793 on 8517  Progress: 1794 on 8517  Progress: 1795 on 8517  Progress: 1796 on 8517  Progress: 1797 on 8517  Progress: 1798 on 8517  Progress: 1799 on 8517  Progress: 1800 on 8517  Progress: 1801 on 8517  Progress: 1802 on 8517  Progress: 1803 on 8517  Progress: 1804 on 8517  Progress: 1805 on 8517  Progress: 1806 on 8517  Progress: 1807 on 8517  Progress: 1808 on 8517  Progress: 1809 on 8517  Progress: 1810 on 8517  Progress: 1811 on 8517  Progress: 1812 on 8517  Progress: 1813 on 8517  Progress: 1814 on 8517  Progress: 1815 on 8517  Progress: 1816 on 8517  Progress: 1817 on 8517  Progress: 1818 on 8517  Progress: 1819 on 8517  Progress: 1820 on 8517  Progress: 1821 on 8517  Progress: 1822 on 8517  Progress: 1823 on 8517  Progress: 1824 on 8517  Progress: 1825 on 8517  Progress: 1826 on 8517  Progress: 1827 on 8517  Progress: 1828 on 8517  Progress: 1829 on 8517  Progress: 1830 on 8517  Progress: 1831 on 8517  Progress: 1832 on 8517  Progress: 1833 on 8517  Progress: 1834 on 8517  Progress: 1835 on 8517  Progress: 1836 on 8517  Progress: 1837 on 8517  Progress: 1838 on 8517  Progress: 1839 on 8517  Progress: 1840 on 8517  Progress: 1841 on 8517  Progress: 1842 on 8517  Progress: 1843 on 8517  Progress: 1844 on 8517  Progress: 1845 on 8517  Progress: 1846 on 8517  Progress: 1847 on 8517  Progress: 1848 on 8517  Progress: 1849 on 8517  Progress: 1850 on 8517  Progress: 1851 on 8517  Progress: 1852 on 8517  Progress: 1853 on 8517  Progress: 1854 on 8517  Progress: 1855 on 8517  Progress: 1856 on 8517  Progress: 1857 on 8517  Progress: 1858 on 8517  Progress: 1859 on 8517  Progress: 1860 on 8517  Progress: 1861 on 8517  Progress: 1862 on 8517  Progress: 1863 on 8517  Progress: 1864 on 8517  Progress: 1865 on 8517  Progress: 1866 on 8517  Progress: 1867 on 8517  Progress: 1868 on 8517  Progress: 1869 on 8517  Progress: 1870 on 8517  Progress: 1871 on 8517  Progress: 1872 on 8517  Progress: 1873 on 8517  Progress: 1874 on 8517  Progress: 1875 on 8517  Progress: 1876 on 8517  Progress: 1877 on 8517  Progress: 1878 on 8517  Progress: 1879 on 8517  Progress: 1880 on 8517  Progress: 1881 on 8517  Progress: 1882 on 8517  Progress: 1883 on 8517  Progress: 1884 on 8517  Progress: 1885 on 8517  Progress: 1886 on 8517  Progress: 1887 on 8517  Progress: 1888 on 8517  Progress: 1889 on 8517  Progress: 1890 on 8517  Progress: 1891 on 8517  Progress: 1892 on 8517  Progress: 1893 on 8517  Progress: 1894 on 8517  Progress: 1895 on 8517  Progress: 1896 on 8517  Progress: 1897 on 8517  Progress: 1898 on 8517  Progress: 1899 on 8517  Progress: 1900 on 8517  Progress: 1901 on 8517  Progress: 1902 on 8517  Progress: 1903 on 8517  Progress: 1904 on 8517  Progress: 1905 on 8517  Progress: 1906 on 8517  Progress: 1907 on 8517  Progress: 1908 on 8517  Progress: 1909 on 8517  Progress: 1910 on 8517  Progress: 1911 on 8517  Progress: 1912 on 8517  Progress: 1913 on 8517  Progress: 1914 on 8517  Progress: 1915 on 8517  Progress: 1916 on 8517  Progress: 1917 on 8517  Progress: 1918 on 8517  Progress: 1919 on 8517  Progress: 1920 on 8517  Progress: 1921 on 8517  Progress: 1922 on 8517  Progress: 1923 on 8517  Progress: 1924 on 8517  Progress: 1925 on 8517  Progress: 1926 on 8517  Progress: 1927 on 8517  Progress: 1928 on 8517  Progress: 1929 on 8517  Progress: 1930 on 8517  Progress: 1931 on 8517  Progress: 1932 on 8517  Progress: 1933 on 8517  Progress: 1934 on 8517  Progress: 1935 on 8517  Progress: 1936 on 8517  Progress: 1937 on 8517  Progress: 1938 on 8517  Progress: 1939 on 8517  Progress: 1940 on 8517  Progress: 1941 on 8517  Progress: 1942 on 8517  Progress: 1943 on 8517  Progress: 1944 on 8517  Progress: 1945 on 8517  Progress: 1946 on 8517  Progress: 1947 on 8517  Progress: 1948 on 8517  Progress: 1949 on 8517  Progress: 1950 on 8517  Progress: 1951 on 8517  Progress: 1952 on 8517  Progress: 1953 on 8517  Progress: 1954 on 8517  Progress: 1955 on 8517  Progress: 1956 on 8517  Progress: 1957 on 8517  Progress: 1958 on 8517  Progress: 1959 on 8517  Progress: 1960 on 8517  Progress: 1961 on 8517  Progress: 1962 on 8517  Progress: 1963 on 8517  Progress: 1964 on 8517  Progress: 1965 on 8517  Progress: 1966 on 8517  Progress: 1967 on 8517  Progress: 1968 on 8517  Progress: 1969 on 8517  Progress: 1970 on 8517  Progress: 1971 on 8517  Progress: 1972 on 8517  Progress: 1973 on 8517  Progress: 1974 on 8517  Progress: 1975 on 8517  Progress: 1976 on 8517  Progress: 1977 on 8517  Progress: 1978 on 8517  Progress: 1979 on 8517  Progress: 1980 on 8517  Progress: 1981 on 8517  Progress: 1982 on 8517  Progress: 1983 on 8517  Progress: 1984 on 8517  Progress: 1985 on 8517  Progress: 1986 on 8517  Progress: 1987 on 8517  Progress: 1988 on 8517  Progress: 1989 on 8517  Progress: 1990 on 8517  Progress: 1991 on 8517  Progress: 1992 on 8517  Progress: 1993 on 8517  Progress: 1994 on 8517  Progress: 1995 on 8517  Progress: 1996 on 8517  Progress: 1997 on 8517  Progress: 1998 on 8517  Progress: 1999 on 8517  Progress: 2000 on 8517  Progress: 2001 on 8517  Progress: 2002 on 8517  Progress: 2003 on 8517  Progress: 2004 on 8517  Progress: 2005 on 8517  Progress: 2006 on 8517  Progress: 2007 on 8517  Progress: 2008 on 8517  Progress: 2009 on 8517  Progress: 2010 on 8517  Progress: 2011 on 8517  Progress: 2012 on 8517  Progress: 2013 on 8517  Progress: 2014 on 8517  Progress: 2015 on 8517  Progress: 2016 on 8517  Progress: 2017 on 8517  Progress: 2018 on 8517  Progress: 2019 on 8517  Progress: 2020 on 8517  Progress: 2021 on 8517  Progress: 2022 on 8517  Progress: 2023 on 8517  Progress: 2024 on 8517  Progress: 2025 on 8517  Progress: 2026 on 8517  Progress: 2027 on 8517  Progress: 2028 on 8517  Progress: 2029 on 8517  Progress: 2030 on 8517  Progress: 2031 on 8517  Progress: 2032 on 8517  Progress: 2033 on 8517  Progress: 2034 on 8517  Progress: 2035 on 8517  Progress: 2036 on 8517  Progress: 2037 on 8517  Progress: 2038 on 8517  Progress: 2039 on 8517  Progress: 2040 on 8517  Progress: 2041 on 8517  Progress: 2042 on 8517  Progress: 2043 on 8517  Progress: 2044 on 8517  Progress: 2045 on 8517  Progress: 2046 on 8517  Progress: 2047 on 8517  Progress: 2048 on 8517  Progress: 2049 on 8517  Progress: 2050 on 8517  Progress: 2051 on 8517  Progress: 2052 on 8517  Progress: 2053 on 8517  Progress: 2054 on 8517  Progress: 2055 on 8517  Progress: 2056 on 8517  Progress: 2057 on 8517  Progress: 2058 on 8517  Progress: 2059 on 8517  Progress: 2060 on 8517  Progress: 2061 on 8517  Progress: 2062 on 8517  Progress: 2063 on 8517  Progress: 2064 on 8517  Progress: 2065 on 8517  Progress: 2066 on 8517  Progress: 2067 on 8517  Progress: 2068 on 8517  Progress: 2069 on 8517  Progress: 2070 on 8517  Progress: 2071 on 8517  Progress: 2072 on 8517  Progress: 2073 on 8517  Progress: 2074 on 8517  Progress: 2075 on 8517  Progress: 2076 on 8517  Progress: 2077 on 8517  Progress: 2078 on 8517  Progress: 2079 on 8517  Progress: 2080 on 8517  Progress: 2081 on 8517  Progress: 2082 on 8517  Progress: 2083 on 8517  Progress: 2084 on 8517  Progress: 2085 on 8517  Progress: 2086 on 8517  Progress: 2087 on 8517  Progress: 2088 on 8517  Progress: 2089 on 8517  Progress: 2090 on 8517  Progress: 2091 on 8517  Progress: 2092 on 8517  Progress: 2093 on 8517  Progress: 2094 on 8517  Progress: 2095 on 8517  Progress: 2096 on 8517  Progress: 2097 on 8517  Progress: 2098 on 8517  Progress: 2099 on 8517  Progress: 2100 on 8517  Progress: 2101 on 8517  Progress: 2102 on 8517  Progress: 2103 on 8517  Progress: 2104 on 8517  Progress: 2105 on 8517  Progress: 2106 on 8517  Progress: 2107 on 8517  Progress: 2108 on 8517  Progress: 2109 on 8517  Progress: 2110 on 8517  Progress: 2111 on 8517  Progress: 2112 on 8517  Progress: 2113 on 8517  Progress: 2114 on 8517  Progress: 2115 on 8517  Progress: 2116 on 8517  Progress: 2117 on 8517  Progress: 2118 on 8517  Progress: 2119 on 8517  Progress: 2120 on 8517  Progress: 2121 on 8517  Progress: 2122 on 8517  Progress: 2123 on 8517  Progress: 2124 on 8517  Progress: 2125 on 8517  Progress: 2126 on 8517  Progress: 2127 on 8517  Progress: 2128 on 8517  Progress: 2129 on 8517  Progress: 2130 on 8517  Progress: 2131 on 8517  Progress: 2132 on 8517  Progress: 2133 on 8517  Progress: 2134 on 8517  Progress: 2135 on 8517  Progress: 2136 on 8517  Progress: 2137 on 8517  Progress: 2138 on 8517  Progress: 2139 on 8517  Progress: 2140 on 8517  Progress: 2141 on 8517  Progress: 2142 on 8517  Progress: 2143 on 8517  Progress: 2144 on 8517  Progress: 2145 on 8517  Progress: 2146 on 8517  Progress: 2147 on 8517  Progress: 2148 on 8517  Progress: 2149 on 8517  Progress: 2150 on 8517  Progress: 2151 on 8517  Progress: 2152 on 8517  Progress: 2153 on 8517  Progress: 2154 on 8517  Progress: 2155 on 8517  Progress: 2156 on 8517  Progress: 2157 on 8517  Progress: 2158 on 8517  Progress: 2159 on 8517  Progress: 2160 on 8517  Progress: 2161 on 8517  Progress: 2162 on 8517  Progress: 2163 on 8517  Progress: 2164 on 8517  Progress: 2165 on 8517  Progress: 2166 on 8517  Progress: 2167 on 8517  Progress: 2168 on 8517  Progress: 2169 on 8517  Progress: 2170 on 8517  Progress: 2171 on 8517  Progress: 2172 on 8517  Progress: 2173 on 8517  Progress: 2174 on 8517  Progress: 2175 on 8517  Progress: 2176 on 8517  Progress: 2177 on 8517  Progress: 2178 on 8517  Progress: 2179 on 8517  Progress: 2180 on 8517  Progress: 2181 on 8517  Progress: 2182 on 8517  Progress: 2183 on 8517  Progress: 2184 on 8517  Progress: 2185 on 8517  Progress: 2186 on 8517  Progress: 2187 on 8517  Progress: 2188 on 8517  Progress: 2189 on 8517  Progress: 2190 on 8517  Progress: 2191 on 8517  Progress: 2192 on 8517  Progress: 2193 on 8517  Progress: 2194 on 8517  Progress: 2195 on 8517  Progress: 2196 on 8517  Progress: 2197 on 8517  Progress: 2198 on 8517  Progress: 2199 on 8517  Progress: 2200 on 8517  Progress: 2201 on 8517  Progress: 2202 on 8517  Progress: 2203 on 8517  Progress: 2204 on 8517  Progress: 2205 on 8517  Progress: 2206 on 8517  Progress: 2207 on 8517  Progress: 2208 on 8517  Progress: 2209 on 8517  Progress: 2210 on 8517  Progress: 2211 on 8517  Progress: 2212 on 8517  Progress: 2213 on 8517  Progress: 2214 on 8517  Progress: 2215 on 8517  Progress: 2216 on 8517  Progress: 2217 on 8517  Progress: 2218 on 8517  Progress: 2219 on 8517  Progress: 2220 on 8517  Progress: 2221 on 8517  Progress: 2222 on 8517  Progress: 2223 on 8517  Progress: 2224 on 8517  Progress: 2225 on 8517  Progress: 2226 on 8517  Progress: 2227 on 8517  Progress: 2228 on 8517  Progress: 2229 on 8517  Progress: 2230 on 8517  Progress: 2231 on 8517  Progress: 2232 on 8517  Progress: 2233 on 8517  Progress: 2234 on 8517  Progress: 2235 on 8517  Progress: 2236 on 8517  Progress: 2237 on 8517  Progress: 2238 on 8517  Progress: 2239 on 8517  Progress: 2240 on 8517  Progress: 2241 on 8517  Progress: 2242 on 8517  Progress: 2243 on 8517  Progress: 2244 on 8517  Progress: 2245 on 8517  Progress: 2246 on 8517  Progress: 2247 on 8517  Progress: 2248 on 8517  Progress: 2249 on 8517  Progress: 2250 on 8517  Progress: 2251 on 8517  Progress: 2252 on 8517  Progress: 2253 on 8517  Progress: 2254 on 8517  Progress: 2255 on 8517  Progress: 2256 on 8517  Progress: 2257 on 8517  Progress: 2258 on 8517  Progress: 2259 on 8517  Progress: 2260 on 8517  Progress: 2261 on 8517  Progress: 2262 on 8517  Progress: 2263 on 8517  Progress: 2264 on 8517  Progress: 2265 on 8517  Progress: 2266 on 8517  Progress: 2267 on 8517  Progress: 2268 on 8517  Progress: 2269 on 8517  Progress: 2270 on 8517  Progress: 2271 on 8517  Progress: 2272 on 8517  Progress: 2273 on 8517  Progress: 2274 on 8517  Progress: 2275 on 8517  Progress: 2276 on 8517  Progress: 2277 on 8517  Progress: 2278 on 8517  Progress: 2279 on 8517  Progress: 2280 on 8517  Progress: 2281 on 8517  Progress: 2282 on 8517  Progress: 2283 on 8517  Progress: 2284 on 8517  Progress: 2285 on 8517  Progress: 2286 on 8517  Progress: 2287 on 8517  Progress: 2288 on 8517  Progress: 2289 on 8517  Progress: 2290 on 8517  Progress: 2291 on 8517  Progress: 2292 on 8517  Progress: 2293 on 8517  Progress: 2294 on 8517  Progress: 2295 on 8517  Progress: 2296 on 8517  Progress: 2297 on 8517  Progress: 2298 on 8517  Progress: 2299 on 8517  Progress: 2300 on 8517  Progress: 2301 on 8517  Progress: 2302 on 8517  Progress: 2303 on 8517  Progress: 2304 on 8517  Progress: 2305 on 8517  Progress: 2306 on 8517  Progress: 2307 on 8517  Progress: 2308 on 8517  Progress: 2309 on 8517  Progress: 2310 on 8517  Progress: 2311 on 8517  Progress: 2312 on 8517  Progress: 2313 on 8517  Progress: 2314 on 8517  Progress: 2315 on 8517  Progress: 2316 on 8517  Progress: 2317 on 8517  Progress: 2318 on 8517  Progress: 2319 on 8517  Progress: 2320 on 8517  Progress: 2321 on 8517  Progress: 2322 on 8517  Progress: 2323 on 8517  Progress: 2324 on 8517  Progress: 2325 on 8517  Progress: 2326 on 8517  Progress: 2327 on 8517  Progress: 2328 on 8517  Progress: 2329 on 8517  Progress: 2330 on 8517  Progress: 2331 on 8517  Progress: 2332 on 8517  Progress: 2333 on 8517  Progress: 2334 on 8517  Progress: 2335 on 8517  Progress: 2336 on 8517  Progress: 2337 on 8517  Progress: 2338 on 8517  Progress: 2339 on 8517  Progress: 2340 on 8517  Progress: 2341 on 8517  Progress: 2342 on 8517  Progress: 2343 on 8517  Progress: 2344 on 8517  Progress: 2345 on 8517  Progress: 2346 on 8517  Progress: 2347 on 8517  Progress: 2348 on 8517  Progress: 2349 on 8517  Progress: 2350 on 8517  Progress: 2351 on 8517  Progress: 2352 on 8517  Progress: 2353 on 8517  Progress: 2354 on 8517  Progress: 2355 on 8517  Progress: 2356 on 8517  Progress: 2357 on 8517  Progress: 2358 on 8517  Progress: 2359 on 8517  Progress: 2360 on 8517  Progress: 2361 on 8517  Progress: 2362 on 8517  Progress: 2363 on 8517  Progress: 2364 on 8517  Progress: 2365 on 8517  Progress: 2366 on 8517  Progress: 2367 on 8517  Progress: 2368 on 8517  Progress: 2369 on 8517  Progress: 2370 on 8517  Progress: 2371 on 8517  Progress: 2372 on 8517  Progress: 2373 on 8517  Progress: 2374 on 8517  Progress: 2375 on 8517  Progress: 2376 on 8517  Progress: 2377 on 8517  Progress: 2378 on 8517  Progress: 2379 on 8517  Progress: 2380 on 8517  Progress: 2381 on 8517  Progress: 2382 on 8517  Progress: 2383 on 8517  Progress: 2384 on 8517  Progress: 2385 on 8517  Progress: 2386 on 8517  Progress: 2387 on 8517  Progress: 2388 on 8517  Progress: 2389 on 8517  Progress: 2390 on 8517  Progress: 2391 on 8517  Progress: 2392 on 8517  Progress: 2393 on 8517  Progress: 2394 on 8517  Progress: 2395 on 8517  Progress: 2396 on 8517  Progress: 2397 on 8517  Progress: 2398 on 8517  Progress: 2399 on 8517  Progress: 2400 on 8517  Progress: 2401 on 8517  Progress: 2402 on 8517  Progress: 2403 on 8517  Progress: 2404 on 8517  Progress: 2405 on 8517  Progress: 2406 on 8517  Progress: 2407 on 8517  Progress: 2408 on 8517  Progress: 2409 on 8517  Progress: 2410 on 8517  Progress: 2411 on 8517  Progress: 2412 on 8517  Progress: 2413 on 8517  Progress: 2414 on 8517  Progress: 2415 on 8517  Progress: 2416 on 8517  Progress: 2417 on 8517  Progress: 2418 on 8517  Progress: 2419 on 8517  Progress: 2420 on 8517  Progress: 2421 on 8517  Progress: 2422 on 8517  Progress: 2423 on 8517  Progress: 2424 on 8517  Progress: 2425 on 8517  Progress: 2426 on 8517  Progress: 2427 on 8517  Progress: 2428 on 8517  Progress: 2429 on 8517  Progress: 2430 on 8517  Progress: 2431 on 8517  Progress: 2432 on 8517  Progress: 2433 on 8517  Progress: 2434 on 8517  Progress: 2435 on 8517  Progress: 2436 on 8517  Progress: 2437 on 8517  Progress: 2438 on 8517  Progress: 2439 on 8517  Progress: 2440 on 8517  Progress: 2441 on 8517  Progress: 2442 on 8517  Progress: 2443 on 8517  Progress: 2444 on 8517  Progress: 2445 on 8517  Progress: 2446 on 8517  Progress: 2447 on 8517  Progress: 2448 on 8517  Progress: 2449 on 8517  Progress: 2450 on 8517  Progress: 2451 on 8517  Progress: 2452 on 8517  Progress: 2453 on 8517  Progress: 2454 on 8517  Progress: 2455 on 8517  Progress: 2456 on 8517  Progress: 2457 on 8517  Progress: 2458 on 8517  Progress: 2459 on 8517  Progress: 2460 on 8517  Progress: 2461 on 8517  Progress: 2462 on 8517  Progress: 2463 on 8517  Progress: 2464 on 8517  Progress: 2465 on 8517  Progress: 2466 on 8517  Progress: 2467 on 8517  Progress: 2468 on 8517  Progress: 2469 on 8517  Progress: 2470 on 8517  Progress: 2471 on 8517  Progress: 2472 on 8517  Progress: 2473 on 8517  Progress: 2474 on 8517  Progress: 2475 on 8517  Progress: 2476 on 8517  Progress: 2477 on 8517  Progress: 2478 on 8517  Progress: 2479 on 8517  Progress: 2480 on 8517  Progress: 2481 on 8517  Progress: 2482 on 8517  Progress: 2483 on 8517  Progress: 2484 on 8517  Progress: 2485 on 8517  Progress: 2486 on 8517  Progress: 2487 on 8517  Progress: 2488 on 8517  Progress: 2489 on 8517  Progress: 2490 on 8517  Progress: 2491 on 8517  Progress: 2492 on 8517  Progress: 2493 on 8517  Progress: 2494 on 8517  Progress: 2495 on 8517  Progress: 2496 on 8517  Progress: 2497 on 8517  Progress: 2498 on 8517  Progress: 2499 on 8517  Progress: 2500 on 8517  Progress: 2501 on 8517  Progress: 2502 on 8517  Progress: 2503 on 8517  Progress: 2504 on 8517  Progress: 2505 on 8517  Progress: 2506 on 8517  Progress: 2507 on 8517  Progress: 2508 on 8517  Progress: 2509 on 8517  Progress: 2510 on 8517  Progress: 2511 on 8517  Progress: 2512 on 8517  Progress: 2513 on 8517  Progress: 2514 on 8517  Progress: 2515 on 8517  Progress: 2516 on 8517  Progress: 2517 on 8517  Progress: 2518 on 8517  Progress: 2519 on 8517  Progress: 2520 on 8517  Progress: 2521 on 8517  Progress: 2522 on 8517  Progress: 2523 on 8517  Progress: 2524 on 8517  Progress: 2525 on 8517  Progress: 2526 on 8517  Progress: 2527 on 8517  Progress: 2528 on 8517  Progress: 2529 on 8517  Progress: 2530 on 8517  Progress: 2531 on 8517  Progress: 2532 on 8517  Progress: 2533 on 8517  Progress: 2534 on 8517  Progress: 2535 on 8517  Progress: 2536 on 8517  Progress: 2537 on 8517  Progress: 2538 on 8517  Progress: 2539 on 8517  Progress: 2540 on 8517  Progress: 2541 on 8517  Progress: 2542 on 8517  Progress: 2543 on 8517  Progress: 2544 on 8517  Progress: 2545 on 8517  Progress: 2546 on 8517  Progress: 2547 on 8517  Progress: 2548 on 8517  Progress: 2549 on 8517  Progress: 2550 on 8517  Progress: 2551 on 8517  Progress: 2552 on 8517  Progress: 2553 on 8517  Progress: 2554 on 8517  Progress: 2555 on 8517  Progress: 2556 on 8517  Progress: 2557 on 8517  Progress: 2558 on 8517  Progress: 2559 on 8517  Progress: 2560 on 8517  Progress: 2561 on 8517  Progress: 2562 on 8517  Progress: 2563 on 8517  Progress: 2564 on 8517  Progress: 2565 on 8517  Progress: 2566 on 8517  Progress: 2567 on 8517  Progress: 2568 on 8517  Progress: 2569 on 8517  Progress: 2570 on 8517  Progress: 2571 on 8517  Progress: 2572 on 8517  Progress: 2573 on 8517  Progress: 2574 on 8517  Progress: 2575 on 8517  Progress: 2576 on 8517  Progress: 2577 on 8517  Progress: 2578 on 8517  Progress: 2579 on 8517  Progress: 2580 on 8517  Progress: 2581 on 8517  Progress: 2582 on 8517  Progress: 2583 on 8517  Progress: 2584 on 8517  Progress: 2585 on 8517  Progress: 2586 on 8517  Progress: 2587 on 8517  Progress: 2588 on 8517  Progress: 2589 on 8517  Progress: 2590 on 8517  Progress: 2591 on 8517  Progress: 2592 on 8517  Progress: 2593 on 8517  Progress: 2594 on 8517  Progress: 2595 on 8517  Progress: 2596 on 8517  Progress: 2597 on 8517  Progress: 2598 on 8517  Progress: 2599 on 8517  Progress: 2600 on 8517  Progress: 2601 on 8517  Progress: 2602 on 8517  Progress: 2603 on 8517  Progress: 2604 on 8517  Progress: 2605 on 8517  Progress: 2606 on 8517  Progress: 2607 on 8517  Progress: 2608 on 8517  Progress: 2609 on 8517  Progress: 2610 on 8517  Progress: 2611 on 8517  Progress: 2612 on 8517  Progress: 2613 on 8517  Progress: 2614 on 8517  Progress: 2615 on 8517  Progress: 2616 on 8517  Progress: 2617 on 8517  Progress: 2618 on 8517  Progress: 2619 on 8517  Progress: 2620 on 8517  Progress: 2621 on 8517  Progress: 2622 on 8517  Progress: 2623 on 8517  Progress: 2624 on 8517  Progress: 2625 on 8517  Progress: 2626 on 8517  Progress: 2627 on 8517  Progress: 2628 on 8517  Progress: 2629 on 8517  Progress: 2630 on 8517  Progress: 2631 on 8517  Progress: 2632 on 8517  Progress: 2633 on 8517  Progress: 2634 on 8517  Progress: 2635 on 8517  Progress: 2636 on 8517  Progress: 2637 on 8517  Progress: 2638 on 8517  Progress: 2639 on 8517  Progress: 2640 on 8517  Progress: 2641 on 8517  Progress: 2642 on 8517  Progress: 2643 on 8517  Progress: 2644 on 8517  Progress: 2645 on 8517  Progress: 2646 on 8517  Progress: 2647 on 8517  Progress: 2648 on 8517  Progress: 2649 on 8517  Progress: 2650 on 8517  Progress: 2651 on 8517  Progress: 2652 on 8517  Progress: 2653 on 8517  Progress: 2654 on 8517  Progress: 2655 on 8517  Progress: 2656 on 8517  Progress: 2657 on 8517  Progress: 2658 on 8517  Progress: 2659 on 8517  Progress: 2660 on 8517  Progress: 2661 on 8517  Progress: 2662 on 8517  Progress: 2663 on 8517  Progress: 2664 on 8517  Progress: 2665 on 8517  Progress: 2666 on 8517  Progress: 2667 on 8517  Progress: 2668 on 8517  Progress: 2669 on 8517  Progress: 2670 on 8517  Progress: 2671 on 8517  Progress: 2672 on 8517  Progress: 2673 on 8517  Progress: 2674 on 8517  Progress: 2675 on 8517  Progress: 2676 on 8517  Progress: 2677 on 8517  Progress: 2678 on 8517  Progress: 2679 on 8517  Progress: 2680 on 8517  Progress: 2681 on 8517  Progress: 2682 on 8517  Progress: 2683 on 8517  Progress: 2684 on 8517  Progress: 2685 on 8517  Progress: 2686 on 8517  Progress: 2687 on 8517  Progress: 2688 on 8517  Progress: 2689 on 8517  Progress: 2690 on 8517  Progress: 2691 on 8517  Progress: 2692 on 8517  Progress: 2693 on 8517  Progress: 2694 on 8517  Progress: 2695 on 8517  Progress: 2696 on 8517  Progress: 2697 on 8517  Progress: 2698 on 8517  Progress: 2699 on 8517  Progress: 2700 on 8517  Progress: 2701 on 8517  Progress: 2702 on 8517  Progress: 2703 on 8517  Progress: 2704 on 8517  Progress: 2705 on 8517  Progress: 2706 on 8517  Progress: 2707 on 8517  Progress: 2708 on 8517  Progress: 2709 on 8517  Progress: 2710 on 8517  Progress: 2711 on 8517  Progress: 2712 on 8517  Progress: 2713 on 8517  Progress: 2714 on 8517  Progress: 2715 on 8517  Progress: 2716 on 8517  Progress: 2717 on 8517  Progress: 2718 on 8517  Progress: 2719 on 8517  Progress: 2720 on 8517  Progress: 2721 on 8517  Progress: 2722 on 8517  Progress: 2723 on 8517  Progress: 2724 on 8517  Progress: 2725 on 8517  Progress: 2726 on 8517  Progress: 2727 on 8517  Progress: 2728 on 8517  Progress: 2729 on 8517  Progress: 2730 on 8517  Progress: 2731 on 8517  Progress: 2732 on 8517  Progress: 2733 on 8517  Progress: 2734 on 8517  Progress: 2735 on 8517  Progress: 2736 on 8517  Progress: 2737 on 8517  Progress: 2738 on 8517  Progress: 2739 on 8517  Progress: 2740 on 8517  Progress: 2741 on 8517  Progress: 2742 on 8517  Progress: 2743 on 8517  Progress: 2744 on 8517  Progress: 2745 on 8517  Progress: 2746 on 8517  Progress: 2747 on 8517  Progress: 2748 on 8517  Progress: 2749 on 8517  Progress: 2750 on 8517  Progress: 2751 on 8517  Progress: 2752 on 8517  Progress: 2753 on 8517  Progress: 2754 on 8517  Progress: 2755 on 8517  Progress: 2756 on 8517  Progress: 2757 on 8517  Progress: 2758 on 8517  Progress: 2759 on 8517  Progress: 2760 on 8517  Progress: 2761 on 8517  Progress: 2762 on 8517  Progress: 2763 on 8517  Progress: 2764 on 8517  Progress: 2765 on 8517  Progress: 2766 on 8517  Progress: 2767 on 8517  Progress: 2768 on 8517  Progress: 2769 on 8517  Progress: 2770 on 8517  Progress: 2771 on 8517  Progress: 2772 on 8517  Progress: 2773 on 8517  Progress: 2774 on 8517  Progress: 2775 on 8517  Progress: 2776 on 8517  Progress: 2777 on 8517  Progress: 2778 on 8517  Progress: 2779 on 8517  Progress: 2780 on 8517  Progress: 2781 on 8517  Progress: 2782 on 8517  Progress: 2783 on 8517  Progress: 2784 on 8517  Progress: 2785 on 8517  Progress: 2786 on 8517  Progress: 2787 on 8517  Progress: 2788 on 8517  Progress: 2789 on 8517  Progress: 2790 on 8517  Progress: 2791 on 8517  Progress: 2792 on 8517  Progress: 2793 on 8517  Progress: 2794 on 8517  Progress: 2795 on 8517  Progress: 2796 on 8517  Progress: 2797 on 8517  Progress: 2798 on 8517  Progress: 2799 on 8517  Progress: 2800 on 8517  Progress: 2801 on 8517  Progress: 2802 on 8517  Progress: 2803 on 8517  Progress: 2804 on 8517  Progress: 2805 on 8517  Progress: 2806 on 8517  Progress: 2807 on 8517  Progress: 2808 on 8517  Progress: 2809 on 8517  Progress: 2810 on 8517  Progress: 2811 on 8517  Progress: 2812 on 8517  Progress: 2813 on 8517  Progress: 2814 on 8517  Progress: 2815 on 8517  Progress: 2816 on 8517  Progress: 2817 on 8517  Progress: 2818 on 8517  Progress: 2819 on 8517  Progress: 2820 on 8517  Progress: 2821 on 8517  Progress: 2822 on 8517  Progress: 2823 on 8517  Progress: 2824 on 8517  Progress: 2825 on 8517  Progress: 2826 on 8517  Progress: 2827 on 8517  Progress: 2828 on 8517  Progress: 2829 on 8517  Progress: 2830 on 8517  Progress: 2831 on 8517  Progress: 2832 on 8517  Progress: 2833 on 8517  Progress: 2834 on 8517  Progress: 2835 on 8517  Progress: 2836 on 8517  Progress: 2837 on 8517  Progress: 2838 on 8517  Progress: 2839 on 8517  Progress: 2840 on 8517  Progress: 2841 on 8517  Progress: 2842 on 8517  Progress: 2843 on 8517  Progress: 2844 on 8517  Progress: 2845 on 8517  Progress: 2846 on 8517  Progress: 2847 on 8517  Progress: 2848 on 8517  Progress: 2849 on 8517  Progress: 2850 on 8517  Progress: 2851 on 8517  Progress: 2852 on 8517  Progress: 2853 on 8517  Progress: 2854 on 8517  Progress: 2855 on 8517  Progress: 2856 on 8517  Progress: 2857 on 8517  Progress: 2858 on 8517  Progress: 2859 on 8517  Progress: 2860 on 8517  Progress: 2861 on 8517  Progress: 2862 on 8517  Progress: 2863 on 8517  Progress: 2864 on 8517  Progress: 2865 on 8517  Progress: 2866 on 8517  Progress: 2867 on 8517  Progress: 2868 on 8517  Progress: 2869 on 8517  Progress: 2870 on 8517  Progress: 2871 on 8517  Progress: 2872 on 8517  Progress: 2873 on 8517  Progress: 2874 on 8517  Progress: 2875 on 8517  Progress: 2876 on 8517  Progress: 2877 on 8517  Progress: 2878 on 8517  Progress: 2879 on 8517  Progress: 2880 on 8517  Progress: 2881 on 8517  Progress: 2882 on 8517  Progress: 2883 on 8517  Progress: 2884 on 8517  Progress: 2885 on 8517  Progress: 2886 on 8517  Progress: 2887 on 8517  Progress: 2888 on 8517  Progress: 2889 on 8517  Progress: 2890 on 8517  Progress: 2891 on 8517  Progress: 2892 on 8517  Progress: 2893 on 8517  Progress: 2894 on 8517  Progress: 2895 on 8517  Progress: 2896 on 8517  Progress: 2897 on 8517  Progress: 2898 on 8517  Progress: 2899 on 8517  Progress: 2900 on 8517  Progress: 2901 on 8517  Progress: 2902 on 8517  Progress: 2903 on 8517  Progress: 2904 on 8517  Progress: 2905 on 8517  Progress: 2906 on 8517  Progress: 2907 on 8517  Progress: 2908 on 8517  Progress: 2909 on 8517  Progress: 2910 on 8517  Progress: 2911 on 8517  Progress: 2912 on 8517  Progress: 2913 on 8517  Progress: 2914 on 8517  Progress: 2915 on 8517  Progress: 2916 on 8517  Progress: 2917 on 8517  Progress: 2918 on 8517  Progress: 2919 on 8517  Progress: 2920 on 8517  Progress: 2921 on 8517  Progress: 2922 on 8517  Progress: 2923 on 8517  Progress: 2924 on 8517  Progress: 2925 on 8517  Progress: 2926 on 8517  Progress: 2927 on 8517  Progress: 2928 on 8517  Progress: 2929 on 8517  Progress: 2930 on 8517  Progress: 2931 on 8517  Progress: 2932 on 8517  Progress: 2933 on 8517  Progress: 2934 on 8517  Progress: 2935 on 8517  Progress: 2936 on 8517  Progress: 2937 on 8517  Progress: 2938 on 8517  Progress: 2939 on 8517  Progress: 2940 on 8517  Progress: 2941 on 8517  Progress: 2942 on 8517  Progress: 2943 on 8517  Progress: 2944 on 8517  Progress: 2945 on 8517  Progress: 2946 on 8517  Progress: 2947 on 8517  Progress: 2948 on 8517  Progress: 2949 on 8517  Progress: 2950 on 8517  Progress: 2951 on 8517  Progress: 2952 on 8517  Progress: 2953 on 8517  Progress: 2954 on 8517  Progress: 2955 on 8517  Progress: 2956 on 8517  Progress: 2957 on 8517  Progress: 2958 on 8517  Progress: 2959 on 8517  Progress: 2960 on 8517  Progress: 2961 on 8517  Progress: 2962 on 8517  Progress: 2963 on 8517  Progress: 2964 on 8517  Progress: 2965 on 8517  Progress: 2966 on 8517  Progress: 2967 on 8517  Progress: 2968 on 8517  Progress: 2969 on 8517  Progress: 2970 on 8517  Progress: 2971 on 8517  Progress: 2972 on 8517  Progress: 2973 on 8517  Progress: 2974 on 8517  Progress: 2975 on 8517  Progress: 2976 on 8517  Progress: 2977 on 8517  Progress: 2978 on 8517  Progress: 2979 on 8517  Progress: 2980 on 8517  Progress: 2981 on 8517  Progress: 2982 on 8517  Progress: 2983 on 8517  Progress: 2984 on 8517  Progress: 2985 on 8517  Progress: 2986 on 8517  Progress: 2987 on 8517  Progress: 2988 on 8517  Progress: 2989 on 8517  Progress: 2990 on 8517  Progress: 2991 on 8517  Progress: 2992 on 8517  Progress: 2993 on 8517  Progress: 2994 on 8517  Progress: 2995 on 8517  Progress: 2996 on 8517  Progress: 2997 on 8517  Progress: 2998 on 8517  Progress: 2999 on 8517  Progress: 3000 on 8517  Progress: 3001 on 8517  Progress: 3002 on 8517  Progress: 3003 on 8517  Progress: 3004 on 8517  Progress: 3005 on 8517  Progress: 3006 on 8517  Progress: 3007 on 8517  Progress: 3008 on 8517  Progress: 3009 on 8517  Progress: 3010 on 8517  Progress: 3011 on 8517  Progress: 3012 on 8517  Progress: 3013 on 8517  Progress: 3014 on 8517  Progress: 3015 on 8517  Progress: 3016 on 8517  Progress: 3017 on 8517  Progress: 3018 on 8517  Progress: 3019 on 8517  Progress: 3020 on 8517  Progress: 3021 on 8517  Progress: 3022 on 8517  Progress: 3023 on 8517  Progress: 3024 on 8517  Progress: 3025 on 8517  Progress: 3026 on 8517  Progress: 3027 on 8517  Progress: 3028 on 8517  Progress: 3029 on 8517  Progress: 3030 on 8517  Progress: 3031 on 8517  Progress: 3032 on 8517  Progress: 3033 on 8517  Progress: 3034 on 8517  Progress: 3035 on 8517  Progress: 3036 on 8517  Progress: 3037 on 8517  Progress: 3038 on 8517  Progress: 3039 on 8517  Progress: 3040 on 8517  Progress: 3041 on 8517  Progress: 3042 on 8517  Progress: 3043 on 8517  Progress: 3044 on 8517  Progress: 3045 on 8517  Progress: 3046 on 8517  Progress: 3047 on 8517  Progress: 3048 on 8517  Progress: 3049 on 8517  Progress: 3050 on 8517  Progress: 3051 on 8517  Progress: 3052 on 8517  Progress: 3053 on 8517  Progress: 3054 on 8517  Progress: 3055 on 8517  Progress: 3056 on 8517  Progress: 3057 on 8517  Progress: 3058 on 8517  Progress: 3059 on 8517  Progress: 3060 on 8517  Progress: 3061 on 8517  Progress: 3062 on 8517  Progress: 3063 on 8517  Progress: 3064 on 8517  Progress: 3065 on 8517  Progress: 3066 on 8517  Progress: 3067 on 8517  Progress: 3068 on 8517  Progress: 3069 on 8517  Progress: 3070 on 8517  Progress: 3071 on 8517  Progress: 3072 on 8517  Progress: 3073 on 8517  Progress: 3074 on 8517  Progress: 3075 on 8517  Progress: 3076 on 8517  Progress: 3077 on 8517  Progress: 3078 on 8517  Progress: 3079 on 8517  Progress: 3080 on 8517  Progress: 3081 on 8517  Progress: 3082 on 8517  Progress: 3083 on 8517  Progress: 3084 on 8517  Progress: 3085 on 8517  Progress: 3086 on 8517  Progress: 3087 on 8517  Progress: 3088 on 8517  Progress: 3089 on 8517  Progress: 3090 on 8517  Progress: 3091 on 8517  Progress: 3092 on 8517  Progress: 3093 on 8517  Progress: 3094 on 8517  Progress: 3095 on 8517  Progress: 3096 on 8517  Progress: 3097 on 8517  Progress: 3098 on 8517  Progress: 3099 on 8517  Progress: 3100 on 8517  Progress: 3101 on 8517  Progress: 3102 on 8517  Progress: 3103 on 8517  Progress: 3104 on 8517  Progress: 3105 on 8517  Progress: 3106 on 8517  Progress: 3107 on 8517  Progress: 3108 on 8517  Progress: 3109 on 8517  Progress: 3110 on 8517  Progress: 3111 on 8517  Progress: 3112 on 8517  Progress: 3113 on 8517  Progress: 3114 on 8517  Progress: 3115 on 8517  Progress: 3116 on 8517  Progress: 3117 on 8517  Progress: 3118 on 8517  Progress: 3119 on 8517  Progress: 3120 on 8517  Progress: 3121 on 8517  Progress: 3122 on 8517  Progress: 3123 on 8517  Progress: 3124 on 8517  Progress: 3125 on 8517  Progress: 3126 on 8517  Progress: 3127 on 8517  Progress: 3128 on 8517  Progress: 3129 on 8517  Progress: 3130 on 8517  Progress: 3131 on 8517  Progress: 3132 on 8517  Progress: 3133 on 8517  Progress: 3134 on 8517  Progress: 3135 on 8517  Progress: 3136 on 8517  Progress: 3137 on 8517  Progress: 3138 on 8517  Progress: 3139 on 8517  Progress: 3140 on 8517  Progress: 3141 on 8517  Progress: 3142 on 8517  Progress: 3143 on 8517  Progress: 3144 on 8517  Progress: 3145 on 8517  Progress: 3146 on 8517  Progress: 3147 on 8517  Progress: 3148 on 8517  Progress: 3149 on 8517  Progress: 3150 on 8517  Progress: 3151 on 8517  Progress: 3152 on 8517  Progress: 3153 on 8517  Progress: 3154 on 8517  Progress: 3155 on 8517  Progress: 3156 on 8517  Progress: 3157 on 8517  Progress: 3158 on 8517  Progress: 3159 on 8517  Progress: 3160 on 8517  Progress: 3161 on 8517  Progress: 3162 on 8517  Progress: 3163 on 8517  Progress: 3164 on 8517  Progress: 3165 on 8517  Progress: 3166 on 8517  Progress: 3167 on 8517  Progress: 3168 on 8517  Progress: 3169 on 8517  Progress: 3170 on 8517  Progress: 3171 on 8517  Progress: 3172 on 8517  Progress: 3173 on 8517  Progress: 3174 on 8517  Progress: 3175 on 8517  Progress: 3176 on 8517  Progress: 3177 on 8517  Progress: 3178 on 8517  Progress: 3179 on 8517  Progress: 3180 on 8517  Progress: 3181 on 8517  Progress: 3182 on 8517  Progress: 3183 on 8517  Progress: 3184 on 8517  Progress: 3185 on 8517  Progress: 3186 on 8517  Progress: 3187 on 8517  Progress: 3188 on 8517  Progress: 3189 on 8517  Progress: 3190 on 8517  Progress: 3191 on 8517  Progress: 3192 on 8517  Progress: 3193 on 8517  Progress: 3194 on 8517  Progress: 3195 on 8517  Progress: 3196 on 8517  Progress: 3197 on 8517  Progress: 3198 on 8517  Progress: 3199 on 8517  Progress: 3200 on 8517  Progress: 3201 on 8517  Progress: 3202 on 8517  Progress: 3203 on 8517  Progress: 3204 on 8517  Progress: 3205 on 8517  Progress: 3206 on 8517  Progress: 3207 on 8517  Progress: 3208 on 8517  Progress: 3209 on 8517  Progress: 3210 on 8517  Progress: 3211 on 8517  Progress: 3212 on 8517  Progress: 3213 on 8517  Progress: 3214 on 8517  Progress: 3215 on 8517  Progress: 3216 on 8517  Progress: 3217 on 8517  Progress: 3218 on 8517  Progress: 3219 on 8517  Progress: 3220 on 8517  Progress: 3221 on 8517  Progress: 3222 on 8517  Progress: 3223 on 8517  Progress: 3224 on 8517  Progress: 3225 on 8517  Progress: 3226 on 8517  Progress: 3227 on 8517  Progress: 3228 on 8517  Progress: 3229 on 8517  Progress: 3230 on 8517  Progress: 3231 on 8517  Progress: 3232 on 8517  Progress: 3233 on 8517  Progress: 3234 on 8517  Progress: 3235 on 8517  Progress: 3236 on 8517  Progress: 3237 on 8517  Progress: 3238 on 8517  Progress: 3239 on 8517  Progress: 3240 on 8517  Progress: 3241 on 8517  Progress: 3242 on 8517  Progress: 3243 on 8517  Progress: 3244 on 8517  Progress: 3245 on 8517  Progress: 3246 on 8517  Progress: 3247 on 8517  Progress: 3248 on 8517  Progress: 3249 on 8517  Progress: 3250 on 8517  Progress: 3251 on 8517  Progress: 3252 on 8517  Progress: 3253 on 8517  Progress: 3254 on 8517  Progress: 3255 on 8517  Progress: 3256 on 8517  Progress: 3257 on 8517  Progress: 3258 on 8517  Progress: 3259 on 8517  Progress: 3260 on 8517  Progress: 3261 on 8517  Progress: 3262 on 8517  Progress: 3263 on 8517  Progress: 3264 on 8517  Progress: 3265 on 8517  Progress: 3266 on 8517  Progress: 3267 on 8517  Progress: 3268 on 8517  Progress: 3269 on 8517  Progress: 3270 on 8517  Progress: 3271 on 8517  Progress: 3272 on 8517  Progress: 3273 on 8517  Progress: 3274 on 8517  Progress: 3275 on 8517  Progress: 3276 on 8517  Progress: 3277 on 8517  Progress: 3278 on 8517  Progress: 3279 on 8517  Progress: 3280 on 8517  Progress: 3281 on 8517  Progress: 3282 on 8517  Progress: 3283 on 8517  Progress: 3284 on 8517  Progress: 3285 on 8517  Progress: 3286 on 8517  Progress: 3287 on 8517  Progress: 3288 on 8517  Progress: 3289 on 8517  Progress: 3290 on 8517  Progress: 3291 on 8517  Progress: 3292 on 8517  Progress: 3293 on 8517  Progress: 3294 on 8517  Progress: 3295 on 8517  Progress: 3296 on 8517  Progress: 3297 on 8517  Progress: 3298 on 8517  Progress: 3299 on 8517  Progress: 3300 on 8517  Progress: 3301 on 8517  Progress: 3302 on 8517  Progress: 3303 on 8517  Progress: 3304 on 8517  Progress: 3305 on 8517  Progress: 3306 on 8517  Progress: 3307 on 8517  Progress: 3308 on 8517  Progress: 3309 on 8517  Progress: 3310 on 8517  Progress: 3311 on 8517  Progress: 3312 on 8517  Progress: 3313 on 8517  Progress: 3314 on 8517  Progress: 3315 on 8517  Progress: 3316 on 8517  Progress: 3317 on 8517  Progress: 3318 on 8517  Progress: 3319 on 8517  Progress: 3320 on 8517  Progress: 3321 on 8517  Progress: 3322 on 8517  Progress: 3323 on 8517  Progress: 3324 on 8517  Progress: 3325 on 8517  Progress: 3326 on 8517  Progress: 3327 on 8517  Progress: 3328 on 8517  Progress: 3329 on 8517  Progress: 3330 on 8517  Progress: 3331 on 8517  Progress: 3332 on 8517  Progress: 3333 on 8517  Progress: 3334 on 8517  Progress: 3335 on 8517  Progress: 3336 on 8517  Progress: 3337 on 8517  Progress: 3338 on 8517  Progress: 3339 on 8517  Progress: 3340 on 8517  Progress: 3341 on 8517  Progress: 3342 on 8517  Progress: 3343 on 8517  Progress: 3344 on 8517  Progress: 3345 on 8517  Progress: 3346 on 8517  Progress: 3347 on 8517  Progress: 3348 on 8517  Progress: 3349 on 8517  Progress: 3350 on 8517  Progress: 3351 on 8517  Progress: 3352 on 8517  Progress: 3353 on 8517  Progress: 3354 on 8517  Progress: 3355 on 8517  Progress: 3356 on 8517  Progress: 3357 on 8517  Progress: 3358 on 8517  Progress: 3359 on 8517  Progress: 3360 on 8517  Progress: 3361 on 8517  Progress: 3362 on 8517  Progress: 3363 on 8517  Progress: 3364 on 8517  Progress: 3365 on 8517  Progress: 3366 on 8517  Progress: 3367 on 8517  Progress: 3368 on 8517  Progress: 3369 on 8517  Progress: 3370 on 8517  Progress: 3371 on 8517  Progress: 3372 on 8517  Progress: 3373 on 8517  Progress: 3374 on 8517  Progress: 3375 on 8517  Progress: 3376 on 8517  Progress: 3377 on 8517  Progress: 3378 on 8517  Progress: 3379 on 8517  Progress: 3380 on 8517  Progress: 3381 on 8517  Progress: 3382 on 8517  Progress: 3383 on 8517  Progress: 3384 on 8517  Progress: 3385 on 8517  Progress: 3386 on 8517  Progress: 3387 on 8517  Progress: 3388 on 8517  Progress: 3389 on 8517  Progress: 3390 on 8517  Progress: 3391 on 8517  Progress: 3392 on 8517  Progress: 3393 on 8517  Progress: 3394 on 8517  Progress: 3395 on 8517  Progress: 3396 on 8517  Progress: 3397 on 8517  Progress: 3398 on 8517  Progress: 3399 on 8517  Progress: 3400 on 8517  Progress: 3401 on 8517  Progress: 3402 on 8517  Progress: 3403 on 8517  Progress: 3404 on 8517  Progress: 3405 on 8517  Progress: 3406 on 8517  Progress: 3407 on 8517  Progress: 3408 on 8517  Progress: 3409 on 8517  Progress: 3410 on 8517  Progress: 3411 on 8517  Progress: 3412 on 8517  Progress: 3413 on 8517  Progress: 3414 on 8517  Progress: 3415 on 8517  Progress: 3416 on 8517  Progress: 3417 on 8517  Progress: 3418 on 8517  Progress: 3419 on 8517  Progress: 3420 on 8517  Progress: 3421 on 8517  Progress: 3422 on 8517  Progress: 3423 on 8517  Progress: 3424 on 8517  Progress: 3425 on 8517  Progress: 3426 on 8517  Progress: 3427 on 8517  Progress: 3428 on 8517  Progress: 3429 on 8517  Progress: 3430 on 8517  Progress: 3431 on 8517  Progress: 3432 on 8517  Progress: 3433 on 8517  Progress: 3434 on 8517  Progress: 3435 on 8517  Progress: 3436 on 8517  Progress: 3437 on 8517  Progress: 3438 on 8517  Progress: 3439 on 8517  Progress: 3440 on 8517  Progress: 3441 on 8517  Progress: 3442 on 8517  Progress: 3443 on 8517  Progress: 3444 on 8517  Progress: 3445 on 8517  Progress: 3446 on 8517  Progress: 3447 on 8517  Progress: 3448 on 8517  Progress: 3449 on 8517  Progress: 3450 on 8517  Progress: 3451 on 8517  Progress: 3452 on 8517  Progress: 3453 on 8517  Progress: 3454 on 8517  Progress: 3455 on 8517  Progress: 3456 on 8517  Progress: 3457 on 8517  Progress: 3458 on 8517  Progress: 3459 on 8517  Progress: 3460 on 8517  Progress: 3461 on 8517  Progress: 3462 on 8517  Progress: 3463 on 8517  Progress: 3464 on 8517  Progress: 3465 on 8517  Progress: 3466 on 8517  Progress: 3467 on 8517  Progress: 3468 on 8517  Progress: 3469 on 8517  Progress: 3470 on 8517  Progress: 3471 on 8517  Progress: 3472 on 8517  Progress: 3473 on 8517  Progress: 3474 on 8517  Progress: 3475 on 8517  Progress: 3476 on 8517  Progress: 3477 on 8517  Progress: 3478 on 8517  Progress: 3479 on 8517  Progress: 3480 on 8517  Progress: 3481 on 8517  Progress: 3482 on 8517  Progress: 3483 on 8517  Progress: 3484 on 8517  Progress: 3485 on 8517  Progress: 3486 on 8517  Progress: 3487 on 8517  Progress: 3488 on 8517  Progress: 3489 on 8517  Progress: 3490 on 8517  Progress: 3491 on 8517  Progress: 3492 on 8517  Progress: 3493 on 8517  Progress: 3494 on 8517  Progress: 3495 on 8517  Progress: 3496 on 8517  Progress: 3497 on 8517  Progress: 3498 on 8517  Progress: 3499 on 8517  Progress: 3500 on 8517  Progress: 3501 on 8517  Progress: 3502 on 8517  Progress: 3503 on 8517  Progress: 3504 on 8517  Progress: 3505 on 8517  Progress: 3506 on 8517  Progress: 3507 on 8517  Progress: 3508 on 8517  Progress: 3509 on 8517  Progress: 3510 on 8517  Progress: 3511 on 8517  Progress: 3512 on 8517  Progress: 3513 on 8517  Progress: 3514 on 8517  Progress: 3515 on 8517  Progress: 3516 on 8517  Progress: 3517 on 8517  Progress: 3518 on 8517  Progress: 3519 on 8517  Progress: 3520 on 8517  Progress: 3521 on 8517  Progress: 3522 on 8517  Progress: 3523 on 8517  Progress: 3524 on 8517  Progress: 3525 on 8517  Progress: 3526 on 8517  Progress: 3527 on 8517  Progress: 3528 on 8517  Progress: 3529 on 8517  Progress: 3530 on 8517  Progress: 3531 on 8517  Progress: 3532 on 8517  Progress: 3533 on 8517  Progress: 3534 on 8517  Progress: 3535 on 8517  Progress: 3536 on 8517  Progress: 3537 on 8517  Progress: 3538 on 8517  Progress: 3539 on 8517  Progress: 3540 on 8517  Progress: 3541 on 8517  Progress: 3542 on 8517  Progress: 3543 on 8517  Progress: 3544 on 8517  Progress: 3545 on 8517  Progress: 3546 on 8517  Progress: 3547 on 8517  Progress: 3548 on 8517  Progress: 3549 on 8517  Progress: 3550 on 8517  Progress: 3551 on 8517  Progress: 3552 on 8517  Progress: 3553 on 8517  Progress: 3554 on 8517  Progress: 3555 on 8517  Progress: 3556 on 8517  Progress: 3557 on 8517  Progress: 3558 on 8517  Progress: 3559 on 8517  Progress: 3560 on 8517  Progress: 3561 on 8517  Progress: 3562 on 8517  Progress: 3563 on 8517  Progress: 3564 on 8517  Progress: 3565 on 8517  Progress: 3566 on 8517  Progress: 3567 on 8517  Progress: 3568 on 8517  Progress: 3569 on 8517  Progress: 3570 on 8517  Progress: 3571 on 8517  Progress: 3572 on 8517  Progress: 3573 on 8517  Progress: 3574 on 8517  Progress: 3575 on 8517  Progress: 3576 on 8517  Progress: 3577 on 8517  Progress: 3578 on 8517  Progress: 3579 on 8517  Progress: 3580 on 8517  Progress: 3581 on 8517  Progress: 3582 on 8517  Progress: 3583 on 8517  Progress: 3584 on 8517  Progress: 3585 on 8517  Progress: 3586 on 8517  Progress: 3587 on 8517  Progress: 3588 on 8517  Progress: 3589 on 8517  Progress: 3590 on 8517  Progress: 3591 on 8517  Progress: 3592 on 8517  Progress: 3593 on 8517  Progress: 3594 on 8517  Progress: 3595 on 8517  Progress: 3596 on 8517  Progress: 3597 on 8517  Progress: 3598 on 8517  Progress: 3599 on 8517  Progress: 3600 on 8517  Progress: 3601 on 8517  Progress: 3602 on 8517  Progress: 3603 on 8517  Progress: 3604 on 8517  Progress: 3605 on 8517  Progress: 3606 on 8517  Progress: 3607 on 8517  Progress: 3608 on 8517  Progress: 3609 on 8517  Progress: 3610 on 8517  Progress: 3611 on 8517  Progress: 3612 on 8517  Progress: 3613 on 8517  Progress: 3614 on 8517  Progress: 3615 on 8517  Progress: 3616 on 8517  Progress: 3617 on 8517  Progress: 3618 on 8517  Progress: 3619 on 8517  Progress: 3620 on 8517  Progress: 3621 on 8517  Progress: 3622 on 8517  Progress: 3623 on 8517  Progress: 3624 on 8517  Progress: 3625 on 8517  Progress: 3626 on 8517  Progress: 3627 on 8517  Progress: 3628 on 8517  Progress: 3629 on 8517  Progress: 3630 on 8517  Progress: 3631 on 8517  Progress: 3632 on 8517  Progress: 3633 on 8517  Progress: 3634 on 8517  Progress: 3635 on 8517  Progress: 3636 on 8517  Progress: 3637 on 8517  Progress: 3638 on 8517  Progress: 3639 on 8517  Progress: 3640 on 8517  Progress: 3641 on 8517  Progress: 3642 on 8517  Progress: 3643 on 8517  Progress: 3644 on 8517  Progress: 3645 on 8517  Progress: 3646 on 8517  Progress: 3647 on 8517  Progress: 3648 on 8517  Progress: 3649 on 8517  Progress: 3650 on 8517  Progress: 3651 on 8517  Progress: 3652 on 8517  Progress: 3653 on 8517  Progress: 3654 on 8517  Progress: 3655 on 8517  Progress: 3656 on 8517  Progress: 3657 on 8517  Progress: 3658 on 8517  Progress: 3659 on 8517  Progress: 3660 on 8517  Progress: 3661 on 8517  Progress: 3662 on 8517  Progress: 3663 on 8517  Progress: 3664 on 8517  Progress: 3665 on 8517  Progress: 3666 on 8517  Progress: 3667 on 8517  Progress: 3668 on 8517  Progress: 3669 on 8517  Progress: 3670 on 8517  Progress: 3671 on 8517  Progress: 3672 on 8517  Progress: 3673 on 8517  Progress: 3674 on 8517  Progress: 3675 on 8517  Progress: 3676 on 8517  Progress: 3677 on 8517  Progress: 3678 on 8517  Progress: 3679 on 8517  Progress: 3680 on 8517  Progress: 3681 on 8517  Progress: 3682 on 8517  Progress: 3683 on 8517  Progress: 3684 on 8517  Progress: 3685 on 8517  Progress: 3686 on 8517  Progress: 3687 on 8517  Progress: 3688 on 8517  Progress: 3689 on 8517  Progress: 3690 on 8517  Progress: 3691 on 8517  Progress: 3692 on 8517  Progress: 3693 on 8517  Progress: 3694 on 8517  Progress: 3695 on 8517  Progress: 3696 on 8517  Progress: 3697 on 8517  Progress: 3698 on 8517  Progress: 3699 on 8517  Progress: 3700 on 8517  Progress: 3701 on 8517  Progress: 3702 on 8517  Progress: 3703 on 8517  Progress: 3704 on 8517  Progress: 3705 on 8517  Progress: 3706 on 8517  Progress: 3707 on 8517  Progress: 3708 on 8517  Progress: 3709 on 8517  Progress: 3710 on 8517  Progress: 3711 on 8517  Progress: 3712 on 8517  Progress: 3713 on 8517  Progress: 3714 on 8517  Progress: 3715 on 8517  Progress: 3716 on 8517  Progress: 3717 on 8517  Progress: 3718 on 8517  Progress: 3719 on 8517  Progress: 3720 on 8517  Progress: 3721 on 8517  Progress: 3722 on 8517  Progress: 3723 on 8517  Progress: 3724 on 8517  Progress: 3725 on 8517  Progress: 3726 on 8517  Progress: 3727 on 8517  Progress: 3728 on 8517  Progress: 3729 on 8517  Progress: 3730 on 8517  Progress: 3731 on 8517  Progress: 3732 on 8517  Progress: 3733 on 8517  Progress: 3734 on 8517  Progress: 3735 on 8517  Progress: 3736 on 8517  Progress: 3737 on 8517  Progress: 3738 on 8517  Progress: 3739 on 8517  Progress: 3740 on 8517  Progress: 3741 on 8517  Progress: 3742 on 8517  Progress: 3743 on 8517  Progress: 3744 on 8517  Progress: 3745 on 8517  Progress: 3746 on 8517  Progress: 3747 on 8517  Progress: 3748 on 8517  Progress: 3749 on 8517  Progress: 3750 on 8517  Progress: 3751 on 8517  Progress: 3752 on 8517  Progress: 3753 on 8517  Progress: 3754 on 8517  Progress: 3755 on 8517  Progress: 3756 on 8517  Progress: 3757 on 8517  Progress: 3758 on 8517  Progress: 3759 on 8517  Progress: 3760 on 8517  Progress: 3761 on 8517  Progress: 3762 on 8517  Progress: 3763 on 8517  Progress: 3764 on 8517  Progress: 3765 on 8517  Progress: 3766 on 8517  Progress: 3767 on 8517  Progress: 3768 on 8517  Progress: 3769 on 8517  Progress: 3770 on 8517  Progress: 3771 on 8517  Progress: 3772 on 8517  Progress: 3773 on 8517  Progress: 3774 on 8517  Progress: 3775 on 8517  Progress: 3776 on 8517  Progress: 3777 on 8517  Progress: 3778 on 8517  Progress: 3779 on 8517  Progress: 3780 on 8517  Progress: 3781 on 8517  Progress: 3782 on 8517  Progress: 3783 on 8517  Progress: 3784 on 8517  Progress: 3785 on 8517  Progress: 3786 on 8517  Progress: 3787 on 8517  Progress: 3788 on 8517  Progress: 3789 on 8517  Progress: 3790 on 8517  Progress: 3791 on 8517  Progress: 3792 on 8517  Progress: 3793 on 8517  Progress: 3794 on 8517  Progress: 3795 on 8517  Progress: 3796 on 8517  Progress: 3797 on 8517  Progress: 3798 on 8517  Progress: 3799 on 8517  Progress: 3800 on 8517  Progress: 3801 on 8517  Progress: 3802 on 8517  Progress: 3803 on 8517  Progress: 3804 on 8517  Progress: 3805 on 8517  Progress: 3806 on 8517  Progress: 3807 on 8517  Progress: 3808 on 8517  Progress: 3809 on 8517  Progress: 3810 on 8517  Progress: 3811 on 8517  Progress: 3812 on 8517  Progress: 3813 on 8517  Progress: 3814 on 8517  Progress: 3815 on 8517  Progress: 3816 on 8517  Progress: 3817 on 8517  Progress: 3818 on 8517  Progress: 3819 on 8517  Progress: 3820 on 8517  Progress: 3821 on 8517  Progress: 3822 on 8517  Progress: 3823 on 8517  Progress: 3824 on 8517  Progress: 3825 on 8517  Progress: 3826 on 8517  Progress: 3827 on 8517  Progress: 3828 on 8517  Progress: 3829 on 8517  Progress: 3830 on 8517  Progress: 3831 on 8517  Progress: 3832 on 8517  Progress: 3833 on 8517  Progress: 3834 on 8517  Progress: 3835 on 8517  Progress: 3836 on 8517  Progress: 3837 on 8517  Progress: 3838 on 8517  Progress: 3839 on 8517  Progress: 3840 on 8517  Progress: 3841 on 8517  Progress: 3842 on 8517  Progress: 3843 on 8517  Progress: 3844 on 8517  Progress: 3845 on 8517  Progress: 3846 on 8517  Progress: 3847 on 8517  Progress: 3848 on 8517  Progress: 3849 on 8517  Progress: 3850 on 8517  Progress: 3851 on 8517  Progress: 3852 on 8517  Progress: 3853 on 8517  Progress: 3854 on 8517  Progress: 3855 on 8517  Progress: 3856 on 8517  Progress: 3857 on 8517  Progress: 3858 on 8517  Progress: 3859 on 8517  Progress: 3860 on 8517  Progress: 3861 on 8517  Progress: 3862 on 8517  Progress: 3863 on 8517  Progress: 3864 on 8517  Progress: 3865 on 8517  Progress: 3866 on 8517  Progress: 3867 on 8517  Progress: 3868 on 8517  Progress: 3869 on 8517  Progress: 3870 on 8517  Progress: 3871 on 8517  Progress: 3872 on 8517  Progress: 3873 on 8517  Progress: 3874 on 8517  Progress: 3875 on 8517  Progress: 3876 on 8517  Progress: 3877 on 8517  Progress: 3878 on 8517  Progress: 3879 on 8517  Progress: 3880 on 8517  Progress: 3881 on 8517  Progress: 3882 on 8517  Progress: 3883 on 8517  Progress: 3884 on 8517  Progress: 3885 on 8517  Progress: 3886 on 8517  Progress: 3887 on 8517  Progress: 3888 on 8517  Progress: 3889 on 8517  Progress: 3890 on 8517  Progress: 3891 on 8517  Progress: 3892 on 8517  Progress: 3893 on 8517  Progress: 3894 on 8517  Progress: 3895 on 8517  Progress: 3896 on 8517  Progress: 3897 on 8517  Progress: 3898 on 8517  Progress: 3899 on 8517  Progress: 3900 on 8517  Progress: 3901 on 8517  Progress: 3902 on 8517  Progress: 3903 on 8517  Progress: 3904 on 8517  Progress: 3905 on 8517  Progress: 3906 on 8517  Progress: 3907 on 8517  Progress: 3908 on 8517  Progress: 3909 on 8517  Progress: 3910 on 8517  Progress: 3911 on 8517  Progress: 3912 on 8517  Progress: 3913 on 8517  Progress: 3914 on 8517  Progress: 3915 on 8517  Progress: 3916 on 8517  Progress: 3917 on 8517  Progress: 3918 on 8517  Progress: 3919 on 8517  Progress: 3920 on 8517  Progress: 3921 on 8517  Progress: 3922 on 8517  Progress: 3923 on 8517  Progress: 3924 on 8517  Progress: 3925 on 8517  Progress: 3926 on 8517  Progress: 3927 on 8517  Progress: 3928 on 8517  Progress: 3929 on 8517  Progress: 3930 on 8517  Progress: 3931 on 8517  Progress: 3932 on 8517  Progress: 3933 on 8517  Progress: 3934 on 8517  Progress: 3935 on 8517  Progress: 3936 on 8517  Progress: 3937 on 8517  Progress: 3938 on 8517  Progress: 3939 on 8517  Progress: 3940 on 8517  Progress: 3941 on 8517  Progress: 3942 on 8517  Progress: 3943 on 8517  Progress: 3944 on 8517  Progress: 3945 on 8517  Progress: 3946 on 8517  Progress: 3947 on 8517  Progress: 3948 on 8517  Progress: 3949 on 8517  Progress: 3950 on 8517  Progress: 3951 on 8517  Progress: 3952 on 8517  Progress: 3953 on 8517  Progress: 3954 on 8517  Progress: 3955 on 8517  Progress: 3956 on 8517  Progress: 3957 on 8517  Progress: 3958 on 8517  Progress: 3959 on 8517  Progress: 3960 on 8517  Progress: 3961 on 8517  Progress: 3962 on 8517  Progress: 3963 on 8517  Progress: 3964 on 8517  Progress: 3965 on 8517  Progress: 3966 on 8517  Progress: 3967 on 8517  Progress: 3968 on 8517  Progress: 3969 on 8517  Progress: 3970 on 8517  Progress: 3971 on 8517  Progress: 3972 on 8517  Progress: 3973 on 8517  Progress: 3974 on 8517  Progress: 3975 on 8517  Progress: 3976 on 8517  Progress: 3977 on 8517  Progress: 3978 on 8517  Progress: 3979 on 8517  Progress: 3980 on 8517  Progress: 3981 on 8517  Progress: 3982 on 8517  Progress: 3983 on 8517  Progress: 3984 on 8517  Progress: 3985 on 8517  Progress: 3986 on 8517  Progress: 3987 on 8517  Progress: 3988 on 8517  Progress: 3989 on 8517  Progress: 3990 on 8517  Progress: 3991 on 8517  Progress: 3992 on 8517  Progress: 3993 on 8517  Progress: 3994 on 8517  Progress: 3995 on 8517  Progress: 3996 on 8517  Progress: 3997 on 8517  Progress: 3998 on 8517  Progress: 3999 on 8517  Progress: 4000 on 8517  Progress: 4001 on 8517  Progress: 4002 on 8517  Progress: 4003 on 8517  Progress: 4004 on 8517  Progress: 4005 on 8517  Progress: 4006 on 8517  Progress: 4007 on 8517  Progress: 4008 on 8517  Progress: 4009 on 8517  Progress: 4010 on 8517  Progress: 4011 on 8517  Progress: 4012 on 8517  Progress: 4013 on 8517  Progress: 4014 on 8517  Progress: 4015 on 8517  Progress: 4016 on 8517  Progress: 4017 on 8517  Progress: 4018 on 8517  Progress: 4019 on 8517  Progress: 4020 on 8517  Progress: 4021 on 8517  Progress: 4022 on 8517  Progress: 4023 on 8517  Progress: 4024 on 8517  Progress: 4025 on 8517  Progress: 4026 on 8517  Progress: 4027 on 8517  Progress: 4028 on 8517  Progress: 4029 on 8517  Progress: 4030 on 8517  Progress: 4031 on 8517  Progress: 4032 on 8517  Progress: 4033 on 8517  Progress: 4034 on 8517  Progress: 4035 on 8517  Progress: 4036 on 8517  Progress: 4037 on 8517  Progress: 4038 on 8517  Progress: 4039 on 8517  Progress: 4040 on 8517  Progress: 4041 on 8517  Progress: 4042 on 8517  Progress: 4043 on 8517  Progress: 4044 on 8517  Progress: 4045 on 8517  Progress: 4046 on 8517  Progress: 4047 on 8517  Progress: 4048 on 8517  Progress: 4049 on 8517  Progress: 4050 on 8517  Progress: 4051 on 8517  Progress: 4052 on 8517  Progress: 4053 on 8517  Progress: 4054 on 8517  Progress: 4055 on 8517  Progress: 4056 on 8517  Progress: 4057 on 8517  Progress: 4058 on 8517  Progress: 4059 on 8517  Progress: 4060 on 8517  Progress: 4061 on 8517  Progress: 4062 on 8517  Progress: 4063 on 8517  Progress: 4064 on 8517  Progress: 4065 on 8517  Progress: 4066 on 8517  Progress: 4067 on 8517  Progress: 4068 on 8517  Progress: 4069 on 8517  Progress: 4070 on 8517  Progress: 4071 on 8517  Progress: 4072 on 8517  Progress: 4073 on 8517  Progress: 4074 on 8517  Progress: 4075 on 8517  Progress: 4076 on 8517  Progress: 4077 on 8517  Progress: 4078 on 8517  Progress: 4079 on 8517  Progress: 4080 on 8517  Progress: 4081 on 8517  Progress: 4082 on 8517  Progress: 4083 on 8517  Progress: 4084 on 8517  Progress: 4085 on 8517  Progress: 4086 on 8517  Progress: 4087 on 8517  Progress: 4088 on 8517  Progress: 4089 on 8517  Progress: 4090 on 8517  Progress: 4091 on 8517  Progress: 4092 on 8517  Progress: 4093 on 8517  Progress: 4094 on 8517  Progress: 4095 on 8517  Progress: 4096 on 8517  Progress: 4097 on 8517  Progress: 4098 on 8517  Progress: 4099 on 8517  Progress: 4100 on 8517  Progress: 4101 on 8517  Progress: 4102 on 8517  Progress: 4103 on 8517  Progress: 4104 on 8517  Progress: 4105 on 8517  Progress: 4106 on 8517  Progress: 4107 on 8517  Progress: 4108 on 8517  Progress: 4109 on 8517  Progress: 4110 on 8517  Progress: 4111 on 8517  Progress: 4112 on 8517  Progress: 4113 on 8517  Progress: 4114 on 8517  Progress: 4115 on 8517  Progress: 4116 on 8517  Progress: 4117 on 8517  Progress: 4118 on 8517  Progress: 4119 on 8517  Progress: 4120 on 8517  Progress: 4121 on 8517  Progress: 4122 on 8517  Progress: 4123 on 8517  Progress: 4124 on 8517  Progress: 4125 on 8517  Progress: 4126 on 8517  Progress: 4127 on 8517  Progress: 4128 on 8517  Progress: 4129 on 8517  Progress: 4130 on 8517  Progress: 4131 on 8517  Progress: 4132 on 8517  Progress: 4133 on 8517  Progress: 4134 on 8517  Progress: 4135 on 8517  Progress: 4136 on 8517  Progress: 4137 on 8517  Progress: 4138 on 8517  Progress: 4139 on 8517  Progress: 4140 on 8517  Progress: 4141 on 8517  Progress: 4142 on 8517  Progress: 4143 on 8517  Progress: 4144 on 8517  Progress: 4145 on 8517  Progress: 4146 on 8517  Progress: 4147 on 8517  Progress: 4148 on 8517  Progress: 4149 on 8517  Progress: 4150 on 8517  Progress: 4151 on 8517  Progress: 4152 on 8517  Progress: 4153 on 8517  Progress: 4154 on 8517  Progress: 4155 on 8517  Progress: 4156 on 8517  Progress: 4157 on 8517  Progress: 4158 on 8517  Progress: 4159 on 8517  Progress: 4160 on 8517  Progress: 4161 on 8517  Progress: 4162 on 8517  Progress: 4163 on 8517  Progress: 4164 on 8517  Progress: 4165 on 8517  Progress: 4166 on 8517  Progress: 4167 on 8517  Progress: 4168 on 8517  Progress: 4169 on 8517  Progress: 4170 on 8517  Progress: 4171 on 8517  Progress: 4172 on 8517  Progress: 4173 on 8517  Progress: 4174 on 8517  Progress: 4175 on 8517  Progress: 4176 on 8517  Progress: 4177 on 8517  Progress: 4178 on 8517  Progress: 4179 on 8517  Progress: 4180 on 8517  Progress: 4181 on 8517  Progress: 4182 on 8517  Progress: 4183 on 8517  Progress: 4184 on 8517  Progress: 4185 on 8517  Progress: 4186 on 8517  Progress: 4187 on 8517  Progress: 4188 on 8517  Progress: 4189 on 8517  Progress: 4190 on 8517  Progress: 4191 on 8517  Progress: 4192 on 8517  Progress: 4193 on 8517  Progress: 4194 on 8517  Progress: 4195 on 8517  Progress: 4196 on 8517  Progress: 4197 on 8517  Progress: 4198 on 8517  Progress: 4199 on 8517  Progress: 4200 on 8517  Progress: 4201 on 8517  Progress: 4202 on 8517  Progress: 4203 on 8517  Progress: 4204 on 8517  Progress: 4205 on 8517  Progress: 4206 on 8517  Progress: 4207 on 8517  Progress: 4208 on 8517  Progress: 4209 on 8517  Progress: 4210 on 8517  Progress: 4211 on 8517  Progress: 4212 on 8517  Progress: 4213 on 8517  Progress: 4214 on 8517  Progress: 4215 on 8517  Progress: 4216 on 8517  Progress: 4217 on 8517  Progress: 4218 on 8517  Progress: 4219 on 8517  Progress: 4220 on 8517  Progress: 4221 on 8517  Progress: 4222 on 8517  Progress: 4223 on 8517  Progress: 4224 on 8517  Progress: 4225 on 8517  Progress: 4226 on 8517  Progress: 4227 on 8517  Progress: 4228 on 8517  Progress: 4229 on 8517  Progress: 4230 on 8517  Progress: 4231 on 8517  Progress: 4232 on 8517  Progress: 4233 on 8517  Progress: 4234 on 8517  Progress: 4235 on 8517  Progress: 4236 on 8517  Progress: 4237 on 8517  Progress: 4238 on 8517  Progress: 4239 on 8517  Progress: 4240 on 8517  Progress: 4241 on 8517  Progress: 4242 on 8517  Progress: 4243 on 8517  Progress: 4244 on 8517  Progress: 4245 on 8517  Progress: 4246 on 8517  Progress: 4247 on 8517  Progress: 4248 on 8517  Progress: 4249 on 8517  Progress: 4250 on 8517  Progress: 4251 on 8517  Progress: 4252 on 8517  Progress: 4253 on 8517  Progress: 4254 on 8517  Progress: 4255 on 8517  Progress: 4256 on 8517  Progress: 4257 on 8517  Progress: 4258 on 8517  Progress: 4259 on 8517  Progress: 4260 on 8517  Progress: 4261 on 8517  Progress: 4262 on 8517  Progress: 4263 on 8517  Progress: 4264 on 8517  Progress: 4265 on 8517  Progress: 4266 on 8517  Progress: 4267 on 8517  Progress: 4268 on 8517  Progress: 4269 on 8517  Progress: 4270 on 8517  Progress: 4271 on 8517  Progress: 4272 on 8517  Progress: 4273 on 8517  Progress: 4274 on 8517  Progress: 4275 on 8517  Progress: 4276 on 8517  Progress: 4277 on 8517  Progress: 4278 on 8517  Progress: 4279 on 8517  Progress: 4280 on 8517  Progress: 4281 on 8517  Progress: 4282 on 8517  Progress: 4283 on 8517  Progress: 4284 on 8517  Progress: 4285 on 8517  Progress: 4286 on 8517  Progress: 4287 on 8517  Progress: 4288 on 8517  Progress: 4289 on 8517  Progress: 4290 on 8517  Progress: 4291 on 8517  Progress: 4292 on 8517  Progress: 4293 on 8517  Progress: 4294 on 8517  Progress: 4295 on 8517  Progress: 4296 on 8517  Progress: 4297 on 8517  Progress: 4298 on 8517  Progress: 4299 on 8517  Progress: 4300 on 8517  Progress: 4301 on 8517  Progress: 4302 on 8517  Progress: 4303 on 8517  Progress: 4304 on 8517  Progress: 4305 on 8517  Progress: 4306 on 8517  Progress: 4307 on 8517  Progress: 4308 on 8517  Progress: 4309 on 8517  Progress: 4310 on 8517  Progress: 4311 on 8517  Progress: 4312 on 8517  Progress: 4313 on 8517  Progress: 4314 on 8517  Progress: 4315 on 8517  Progress: 4316 on 8517  Progress: 4317 on 8517  Progress: 4318 on 8517  Progress: 4319 on 8517  Progress: 4320 on 8517  Progress: 4321 on 8517  Progress: 4322 on 8517  Progress: 4323 on 8517  Progress: 4324 on 8517  Progress: 4325 on 8517  Progress: 4326 on 8517  Progress: 4327 on 8517  Progress: 4328 on 8517  Progress: 4329 on 8517  Progress: 4330 on 8517  Progress: 4331 on 8517  Progress: 4332 on 8517  Progress: 4333 on 8517  Progress: 4334 on 8517  Progress: 4335 on 8517  Progress: 4336 on 8517  Progress: 4337 on 8517  Progress: 4338 on 8517  Progress: 4339 on 8517  Progress: 4340 on 8517  Progress: 4341 on 8517  Progress: 4342 on 8517  Progress: 4343 on 8517  Progress: 4344 on 8517  Progress: 4345 on 8517  Progress: 4346 on 8517  Progress: 4347 on 8517  Progress: 4348 on 8517  Progress: 4349 on 8517  Progress: 4350 on 8517  Progress: 4351 on 8517  Progress: 4352 on 8517  Progress: 4353 on 8517  Progress: 4354 on 8517  Progress: 4355 on 8517  Progress: 4356 on 8517  Progress: 4357 on 8517  Progress: 4358 on 8517  Progress: 4359 on 8517  Progress: 4360 on 8517  Progress: 4361 on 8517  Progress: 4362 on 8517  Progress: 4363 on 8517  Progress: 4364 on 8517  Progress: 4365 on 8517  Progress: 4366 on 8517  Progress: 4367 on 8517  Progress: 4368 on 8517  Progress: 4369 on 8517  Progress: 4370 on 8517  Progress: 4371 on 8517  Progress: 4372 on 8517  Progress: 4373 on 8517  Progress: 4374 on 8517  Progress: 4375 on 8517  Progress: 4376 on 8517  Progress: 4377 on 8517  Progress: 4378 on 8517  Progress: 4379 on 8517  Progress: 4380 on 8517  Progress: 4381 on 8517  Progress: 4382 on 8517  Progress: 4383 on 8517  Progress: 4384 on 8517  Progress: 4385 on 8517  Progress: 4386 on 8517  Progress: 4387 on 8517  Progress: 4388 on 8517  Progress: 4389 on 8517  Progress: 4390 on 8517  Progress: 4391 on 8517  Progress: 4392 on 8517  Progress: 4393 on 8517  Progress: 4394 on 8517  Progress: 4395 on 8517  Progress: 4396 on 8517  Progress: 4397 on 8517  Progress: 4398 on 8517  Progress: 4399 on 8517  Progress: 4400 on 8517  Progress: 4401 on 8517  Progress: 4402 on 8517  Progress: 4403 on 8517  Progress: 4404 on 8517  Progress: 4405 on 8517  Progress: 4406 on 8517  Progress: 4407 on 8517  Progress: 4408 on 8517  Progress: 4409 on 8517  Progress: 4410 on 8517  Progress: 4411 on 8517  Progress: 4412 on 8517  Progress: 4413 on 8517  Progress: 4414 on 8517  Progress: 4415 on 8517  Progress: 4416 on 8517  Progress: 4417 on 8517  Progress: 4418 on 8517  Progress: 4419 on 8517  Progress: 4420 on 8517  Progress: 4421 on 8517  Progress: 4422 on 8517  Progress: 4423 on 8517  Progress: 4424 on 8517  Progress: 4425 on 8517  Progress: 4426 on 8517  Progress: 4427 on 8517  Progress: 4428 on 8517  Progress: 4429 on 8517  Progress: 4430 on 8517  Progress: 4431 on 8517  Progress: 4432 on 8517  Progress: 4433 on 8517  Progress: 4434 on 8517  Progress: 4435 on 8517  Progress: 4436 on 8517  Progress: 4437 on 8517  Progress: 4438 on 8517  Progress: 4439 on 8517  Progress: 4440 on 8517  Progress: 4441 on 8517  Progress: 4442 on 8517  Progress: 4443 on 8517  Progress: 4444 on 8517  Progress: 4445 on 8517  Progress: 4446 on 8517  Progress: 4447 on 8517  Progress: 4448 on 8517  Progress: 4449 on 8517  Progress: 4450 on 8517  Progress: 4451 on 8517  Progress: 4452 on 8517  Progress: 4453 on 8517  Progress: 4454 on 8517  Progress: 4455 on 8517  Progress: 4456 on 8517  Progress: 4457 on 8517  Progress: 4458 on 8517  Progress: 4459 on 8517  Progress: 4460 on 8517  Progress: 4461 on 8517  Progress: 4462 on 8517  Progress: 4463 on 8517  Progress: 4464 on 8517  Progress: 4465 on 8517  Progress: 4466 on 8517  Progress: 4467 on 8517  Progress: 4468 on 8517  Progress: 4469 on 8517  Progress: 4470 on 8517  Progress: 4471 on 8517  Progress: 4472 on 8517  Progress: 4473 on 8517  Progress: 4474 on 8517  Progress: 4475 on 8517  Progress: 4476 on 8517  Progress: 4477 on 8517  Progress: 4478 on 8517  Progress: 4479 on 8517  Progress: 4480 on 8517  Progress: 4481 on 8517  Progress: 4482 on 8517  Progress: 4483 on 8517  Progress: 4484 on 8517  Progress: 4485 on 8517  Progress: 4486 on 8517  Progress: 4487 on 8517  Progress: 4488 on 8517  Progress: 4489 on 8517  Progress: 4490 on 8517  Progress: 4491 on 8517  Progress: 4492 on 8517  Progress: 4493 on 8517  Progress: 4494 on 8517  Progress: 4495 on 8517  Progress: 4496 on 8517  Progress: 4497 on 8517  Progress: 4498 on 8517  Progress: 4499 on 8517  Progress: 4500 on 8517  Progress: 4501 on 8517  Progress: 4502 on 8517  Progress: 4503 on 8517  Progress: 4504 on 8517  Progress: 4505 on 8517  Progress: 4506 on 8517  Progress: 4507 on 8517  Progress: 4508 on 8517  Progress: 4509 on 8517  Progress: 4510 on 8517  Progress: 4511 on 8517  Progress: 4512 on 8517  Progress: 4513 on 8517  Progress: 4514 on 8517  Progress: 4515 on 8517  Progress: 4516 on 8517  Progress: 4517 on 8517  Progress: 4518 on 8517  Progress: 4519 on 8517  Progress: 4520 on 8517  Progress: 4521 on 8517  Progress: 4522 on 8517  Progress: 4523 on 8517  Progress: 4524 on 8517  Progress: 4525 on 8517  Progress: 4526 on 8517  Progress: 4527 on 8517  Progress: 4528 on 8517  Progress: 4529 on 8517  Progress: 4530 on 8517  Progress: 4531 on 8517  Progress: 4532 on 8517  Progress: 4533 on 8517  Progress: 4534 on 8517  Progress: 4535 on 8517  Progress: 4536 on 8517  Progress: 4537 on 8517  Progress: 4538 on 8517  Progress: 4539 on 8517  Progress: 4540 on 8517  Progress: 4541 on 8517  Progress: 4542 on 8517  Progress: 4543 on 8517  Progress: 4544 on 8517  Progress: 4545 on 8517  Progress: 4546 on 8517  Progress: 4547 on 8517  Progress: 4548 on 8517  Progress: 4549 on 8517  Progress: 4550 on 8517  Progress: 4551 on 8517  Progress: 4552 on 8517  Progress: 4553 on 8517  Progress: 4554 on 8517  Progress: 4555 on 8517  Progress: 4556 on 8517  Progress: 4557 on 8517  Progress: 4558 on 8517  Progress: 4559 on 8517  Progress: 4560 on 8517  Progress: 4561 on 8517  Progress: 4562 on 8517  Progress: 4563 on 8517  Progress: 4564 on 8517  Progress: 4565 on 8517  Progress: 4566 on 8517  Progress: 4567 on 8517  Progress: 4568 on 8517  Progress: 4569 on 8517  Progress: 4570 on 8517  Progress: 4571 on 8517  Progress: 4572 on 8517  Progress: 4573 on 8517  Progress: 4574 on 8517  Progress: 4575 on 8517  Progress: 4576 on 8517  Progress: 4577 on 8517  Progress: 4578 on 8517  Progress: 4579 on 8517  Progress: 4580 on 8517  Progress: 4581 on 8517  Progress: 4582 on 8517  Progress: 4583 on 8517  Progress: 4584 on 8517  Progress: 4585 on 8517  Progress: 4586 on 8517  Progress: 4587 on 8517  Progress: 4588 on 8517  Progress: 4589 on 8517  Progress: 4590 on 8517  Progress: 4591 on 8517  Progress: 4592 on 8517  Progress: 4593 on 8517  Progress: 4594 on 8517  Progress: 4595 on 8517  Progress: 4596 on 8517  Progress: 4597 on 8517  Progress: 4598 on 8517  Progress: 4599 on 8517  Progress: 4600 on 8517  Progress: 4601 on 8517  Progress: 4602 on 8517  Progress: 4603 on 8517  Progress: 4604 on 8517  Progress: 4605 on 8517  Progress: 4606 on 8517  Progress: 4607 on 8517  Progress: 4608 on 8517  Progress: 4609 on 8517  Progress: 4610 on 8517  Progress: 4611 on 8517  Progress: 4612 on 8517  Progress: 4613 on 8517  Progress: 4614 on 8517  Progress: 4615 on 8517  Progress: 4616 on 8517  Progress: 4617 on 8517  Progress: 4618 on 8517  Progress: 4619 on 8517  Progress: 4620 on 8517  Progress: 4621 on 8517  Progress: 4622 on 8517  Progress: 4623 on 8517  Progress: 4624 on 8517  Progress: 4625 on 8517  Progress: 4626 on 8517  Progress: 4627 on 8517  Progress: 4628 on 8517  Progress: 4629 on 8517  Progress: 4630 on 8517  Progress: 4631 on 8517  Progress: 4632 on 8517  Progress: 4633 on 8517  Progress: 4634 on 8517  Progress: 4635 on 8517  Progress: 4636 on 8517  Progress: 4637 on 8517  Progress: 4638 on 8517  Progress: 4639 on 8517  Progress: 4640 on 8517  Progress: 4641 on 8517  Progress: 4642 on 8517  Progress: 4643 on 8517  Progress: 4644 on 8517  Progress: 4645 on 8517  Progress: 4646 on 8517  Progress: 4647 on 8517  Progress: 4648 on 8517  Progress: 4649 on 8517  Progress: 4650 on 8517  Progress: 4651 on 8517  Progress: 4652 on 8517  Progress: 4653 on 8517  Progress: 4654 on 8517  Progress: 4655 on 8517  Progress: 4656 on 8517  Progress: 4657 on 8517  Progress: 4658 on 8517  Progress: 4659 on 8517  Progress: 4660 on 8517  Progress: 4661 on 8517  Progress: 4662 on 8517  Progress: 4663 on 8517  Progress: 4664 on 8517  Progress: 4665 on 8517  Progress: 4666 on 8517  Progress: 4667 on 8517  Progress: 4668 on 8517  Progress: 4669 on 8517  Progress: 4670 on 8517  Progress: 4671 on 8517  Progress: 4672 on 8517  Progress: 4673 on 8517  Progress: 4674 on 8517  Progress: 4675 on 8517  Progress: 4676 on 8517  Progress: 4677 on 8517  Progress: 4678 on 8517  Progress: 4679 on 8517  Progress: 4680 on 8517  Progress: 4681 on 8517  Progress: 4682 on 8517  Progress: 4683 on 8517  Progress: 4684 on 8517  Progress: 4685 on 8517  Progress: 4686 on 8517  Progress: 4687 on 8517  Progress: 4688 on 8517  Progress: 4689 on 8517  Progress: 4690 on 8517  Progress: 4691 on 8517  Progress: 4692 on 8517  Progress: 4693 on 8517  Progress: 4694 on 8517  Progress: 4695 on 8517  Progress: 4696 on 8517  Progress: 4697 on 8517  Progress: 4698 on 8517  Progress: 4699 on 8517  Progress: 4700 on 8517  Progress: 4701 on 8517  Progress: 4702 on 8517  Progress: 4703 on 8517  Progress: 4704 on 8517  Progress: 4705 on 8517  Progress: 4706 on 8517  Progress: 4707 on 8517  Progress: 4708 on 8517  Progress: 4709 on 8517  Progress: 4710 on 8517  Progress: 4711 on 8517  Progress: 4712 on 8517  Progress: 4713 on 8517  Progress: 4714 on 8517  Progress: 4715 on 8517  Progress: 4716 on 8517  Progress: 4717 on 8517  Progress: 4718 on 8517  Progress: 4719 on 8517  Progress: 4720 on 8517  Progress: 4721 on 8517  Progress: 4722 on 8517  Progress: 4723 on 8517  Progress: 4724 on 8517  Progress: 4725 on 8517  Progress: 4726 on 8517  Progress: 4727 on 8517  Progress: 4728 on 8517  Progress: 4729 on 8517  Progress: 4730 on 8517  Progress: 4731 on 8517  Progress: 4732 on 8517  Progress: 4733 on 8517  Progress: 4734 on 8517  Progress: 4735 on 8517  Progress: 4736 on 8517  Progress: 4737 on 8517  Progress: 4738 on 8517  Progress: 4739 on 8517  Progress: 4740 on 8517  Progress: 4741 on 8517  Progress: 4742 on 8517  Progress: 4743 on 8517  Progress: 4744 on 8517  Progress: 4745 on 8517  Progress: 4746 on 8517  Progress: 4747 on 8517  Progress: 4748 on 8517  Progress: 4749 on 8517  Progress: 4750 on 8517  Progress: 4751 on 8517  Progress: 4752 on 8517  Progress: 4753 on 8517  Progress: 4754 on 8517  Progress: 4755 on 8517  Progress: 4756 on 8517  Progress: 4757 on 8517  Progress: 4758 on 8517  Progress: 4759 on 8517  Progress: 4760 on 8517  Progress: 4761 on 8517  Progress: 4762 on 8517  Progress: 4763 on 8517  Progress: 4764 on 8517  Progress: 4765 on 8517  Progress: 4766 on 8517  Progress: 4767 on 8517  Progress: 4768 on 8517  Progress: 4769 on 8517  Progress: 4770 on 8517  Progress: 4771 on 8517  Progress: 4772 on 8517  Progress: 4773 on 8517  Progress: 4774 on 8517  Progress: 4775 on 8517  Progress: 4776 on 8517  Progress: 4777 on 8517  Progress: 4778 on 8517  Progress: 4779 on 8517  Progress: 4780 on 8517  Progress: 4781 on 8517  Progress: 4782 on 8517  Progress: 4783 on 8517  Progress: 4784 on 8517  Progress: 4785 on 8517  Progress: 4786 on 8517  Progress: 4787 on 8517  Progress: 4788 on 8517  Progress: 4789 on 8517  Progress: 4790 on 8517  Progress: 4791 on 8517  Progress: 4792 on 8517  Progress: 4793 on 8517  Progress: 4794 on 8517  Progress: 4795 on 8517  Progress: 4796 on 8517  Progress: 4797 on 8517  Progress: 4798 on 8517  Progress: 4799 on 8517  Progress: 4800 on 8517  Progress: 4801 on 8517  Progress: 4802 on 8517  Progress: 4803 on 8517  Progress: 4804 on 8517  Progress: 4805 on 8517  Progress: 4806 on 8517  Progress: 4807 on 8517  Progress: 4808 on 8517  Progress: 4809 on 8517  Progress: 4810 on 8517  Progress: 4811 on 8517  Progress: 4812 on 8517  Progress: 4813 on 8517  Progress: 4814 on 8517  Progress: 4815 on 8517  Progress: 4816 on 8517  Progress: 4817 on 8517  Progress: 4818 on 8517  Progress: 4819 on 8517  Progress: 4820 on 8517  Progress: 4821 on 8517  Progress: 4822 on 8517  Progress: 4823 on 8517  Progress: 4824 on 8517  Progress: 4825 on 8517  Progress: 4826 on 8517  Progress: 4827 on 8517  Progress: 4828 on 8517  Progress: 4829 on 8517  Progress: 4830 on 8517  Progress: 4831 on 8517  Progress: 4832 on 8517  Progress: 4833 on 8517  Progress: 4834 on 8517  Progress: 4835 on 8517  Progress: 4836 on 8517  Progress: 4837 on 8517  Progress: 4838 on 8517  Progress: 4839 on 8517  Progress: 4840 on 8517  Progress: 4841 on 8517  Progress: 4842 on 8517  Progress: 4843 on 8517  Progress: 4844 on 8517  Progress: 4845 on 8517  Progress: 4846 on 8517  Progress: 4847 on 8517  Progress: 4848 on 8517  Progress: 4849 on 8517  Progress: 4850 on 8517  Progress: 4851 on 8517  Progress: 4852 on 8517  Progress: 4853 on 8517  Progress: 4854 on 8517  Progress: 4855 on 8517  Progress: 4856 on 8517  Progress: 4857 on 8517  Progress: 4858 on 8517  Progress: 4859 on 8517  Progress: 4860 on 8517  Progress: 4861 on 8517  Progress: 4862 on 8517  Progress: 4863 on 8517  Progress: 4864 on 8517  Progress: 4865 on 8517  Progress: 4866 on 8517  Progress: 4867 on 8517  Progress: 4868 on 8517  Progress: 4869 on 8517  Progress: 4870 on 8517  Progress: 4871 on 8517  Progress: 4872 on 8517  Progress: 4873 on 8517  Progress: 4874 on 8517  Progress: 4875 on 8517  Progress: 4876 on 8517  Progress: 4877 on 8517  Progress: 4878 on 8517  Progress: 4879 on 8517  Progress: 4880 on 8517  Progress: 4881 on 8517  Progress: 4882 on 8517  Progress: 4883 on 8517  Progress: 4884 on 8517  Progress: 4885 on 8517  Progress: 4886 on 8517  Progress: 4887 on 8517  Progress: 4888 on 8517  Progress: 4889 on 8517  Progress: 4890 on 8517  Progress: 4891 on 8517  Progress: 4892 on 8517  Progress: 4893 on 8517  Progress: 4894 on 8517  Progress: 4895 on 8517  Progress: 4896 on 8517  Progress: 4897 on 8517  Progress: 4898 on 8517  Progress: 4899 on 8517  Progress: 4900 on 8517  Progress: 4901 on 8517  Progress: 4902 on 8517  Progress: 4903 on 8517  Progress: 4904 on 8517  Progress: 4905 on 8517  Progress: 4906 on 8517  Progress: 4907 on 8517  Progress: 4908 on 8517  Progress: 4909 on 8517  Progress: 4910 on 8517  Progress: 4911 on 8517  Progress: 4912 on 8517  Progress: 4913 on 8517  Progress: 4914 on 8517  Progress: 4915 on 8517  Progress: 4916 on 8517  Progress: 4917 on 8517  Progress: 4918 on 8517  Progress: 4919 on 8517  Progress: 4920 on 8517  Progress: 4921 on 8517  Progress: 4922 on 8517  Progress: 4923 on 8517  Progress: 4924 on 8517  Progress: 4925 on 8517  Progress: 4926 on 8517  Progress: 4927 on 8517  Progress: 4928 on 8517  Progress: 4929 on 8517  Progress: 4930 on 8517  Progress: 4931 on 8517  Progress: 4932 on 8517  Progress: 4933 on 8517  Progress: 4934 on 8517  Progress: 4935 on 8517  Progress: 4936 on 8517  Progress: 4937 on 8517  Progress: 4938 on 8517  Progress: 4939 on 8517  Progress: 4940 on 8517  Progress: 4941 on 8517  Progress: 4942 on 8517  Progress: 4943 on 8517  Progress: 4944 on 8517  Progress: 4945 on 8517  Progress: 4946 on 8517  Progress: 4947 on 8517  Progress: 4948 on 8517  Progress: 4949 on 8517  Progress: 4950 on 8517  Progress: 4951 on 8517  Progress: 4952 on 8517  Progress: 4953 on 8517  Progress: 4954 on 8517  Progress: 4955 on 8517  Progress: 4956 on 8517  Progress: 4957 on 8517  Progress: 4958 on 8517  Progress: 4959 on 8517  Progress: 4960 on 8517  Progress: 4961 on 8517  Progress: 4962 on 8517  Progress: 4963 on 8517  Progress: 4964 on 8517  Progress: 4965 on 8517  Progress: 4966 on 8517  Progress: 4967 on 8517  Progress: 4968 on 8517  Progress: 4969 on 8517  Progress: 4970 on 8517  Progress: 4971 on 8517  Progress: 4972 on 8517  Progress: 4973 on 8517  Progress: 4974 on 8517  Progress: 4975 on 8517  Progress: 4976 on 8517  Progress: 4977 on 8517  Progress: 4978 on 8517  Progress: 4979 on 8517  Progress: 4980 on 8517  Progress: 4981 on 8517  Progress: 4982 on 8517  Progress: 4983 on 8517  Progress: 4984 on 8517  Progress: 4985 on 8517  Progress: 4986 on 8517  Progress: 4987 on 8517  Progress: 4988 on 8517  Progress: 4989 on 8517  Progress: 4990 on 8517  Progress: 4991 on 8517  Progress: 4992 on 8517  Progress: 4993 on 8517  Progress: 4994 on 8517  Progress: 4995 on 8517  Progress: 4996 on 8517  Progress: 4997 on 8517  Progress: 4998 on 8517  Progress: 4999 on 8517  Progress: 5000 on 8517  Progress: 5001 on 8517  Progress: 5002 on 8517  Progress: 5003 on 8517  Progress: 5004 on 8517  Progress: 5005 on 8517  Progress: 5006 on 8517  Progress: 5007 on 8517  Progress: 5008 on 8517  Progress: 5009 on 8517  Progress: 5010 on 8517  Progress: 5011 on 8517  Progress: 5012 on 8517  Progress: 5013 on 8517  Progress: 5014 on 8517  Progress: 5015 on 8517  Progress: 5016 on 8517  Progress: 5017 on 8517  Progress: 5018 on 8517  Progress: 5019 on 8517  Progress: 5020 on 8517  Progress: 5021 on 8517  Progress: 5022 on 8517  Progress: 5023 on 8517  Progress: 5024 on 8517  Progress: 5025 on 8517  Progress: 5026 on 8517  Progress: 5027 on 8517  Progress: 5028 on 8517  Progress: 5029 on 8517  Progress: 5030 on 8517  Progress: 5031 on 8517  Progress: 5032 on 8517  Progress: 5033 on 8517  Progress: 5034 on 8517  Progress: 5035 on 8517  Progress: 5036 on 8517  Progress: 5037 on 8517  Progress: 5038 on 8517  Progress: 5039 on 8517  Progress: 5040 on 8517  Progress: 5041 on 8517  Progress: 5042 on 8517  Progress: 5043 on 8517  Progress: 5044 on 8517  Progress: 5045 on 8517  Progress: 5046 on 8517  Progress: 5047 on 8517  Progress: 5048 on 8517  Progress: 5049 on 8517  Progress: 5050 on 8517  Progress: 5051 on 8517  Progress: 5052 on 8517  Progress: 5053 on 8517  Progress: 5054 on 8517  Progress: 5055 on 8517  Progress: 5056 on 8517  Progress: 5057 on 8517  Progress: 5058 on 8517  Progress: 5059 on 8517  Progress: 5060 on 8517  Progress: 5061 on 8517  Progress: 5062 on 8517  Progress: 5063 on 8517  Progress: 5064 on 8517  Progress: 5065 on 8517  Progress: 5066 on 8517  Progress: 5067 on 8517  Progress: 5068 on 8517  Progress: 5069 on 8517  Progress: 5070 on 8517  Progress: 5071 on 8517  Progress: 5072 on 8517  Progress: 5073 on 8517  Progress: 5074 on 8517  Progress: 5075 on 8517  Progress: 5076 on 8517  Progress: 5077 on 8517  Progress: 5078 on 8517  Progress: 5079 on 8517  Progress: 5080 on 8517  Progress: 5081 on 8517  Progress: 5082 on 8517  Progress: 5083 on 8517  Progress: 5084 on 8517  Progress: 5085 on 8517  Progress: 5086 on 8517  Progress: 5087 on 8517  Progress: 5088 on 8517  Progress: 5089 on 8517  Progress: 5090 on 8517  Progress: 5091 on 8517  Progress: 5092 on 8517  Progress: 5093 on 8517  Progress: 5094 on 8517  Progress: 5095 on 8517  Progress: 5096 on 8517  Progress: 5097 on 8517  Progress: 5098 on 8517  Progress: 5099 on 8517  Progress: 5100 on 8517  Progress: 5101 on 8517  Progress: 5102 on 8517  Progress: 5103 on 8517  Progress: 5104 on 8517  Progress: 5105 on 8517  Progress: 5106 on 8517  Progress: 5107 on 8517  Progress: 5108 on 8517  Progress: 5109 on 8517  Progress: 5110 on 8517  Progress: 5111 on 8517  Progress: 5112 on 8517  Progress: 5113 on 8517  Progress: 5114 on 8517  Progress: 5115 on 8517  Progress: 5116 on 8517  Progress: 5117 on 8517  Progress: 5118 on 8517  Progress: 5119 on 8517  Progress: 5120 on 8517  Progress: 5121 on 8517  Progress: 5122 on 8517  Progress: 5123 on 8517  Progress: 5124 on 8517  Progress: 5125 on 8517  Progress: 5126 on 8517  Progress: 5127 on 8517  Progress: 5128 on 8517  Progress: 5129 on 8517  Progress: 5130 on 8517  Progress: 5131 on 8517  Progress: 5132 on 8517  Progress: 5133 on 8517  Progress: 5134 on 8517  Progress: 5135 on 8517  Progress: 5136 on 8517  Progress: 5137 on 8517  Progress: 5138 on 8517  Progress: 5139 on 8517  Progress: 5140 on 8517  Progress: 5141 on 8517  Progress: 5142 on 8517  Progress: 5143 on 8517  Progress: 5144 on 8517  Progress: 5145 on 8517  Progress: 5146 on 8517  Progress: 5147 on 8517  Progress: 5148 on 8517  Progress: 5149 on 8517  Progress: 5150 on 8517  Progress: 5151 on 8517  Progress: 5152 on 8517  Progress: 5153 on 8517  Progress: 5154 on 8517  Progress: 5155 on 8517  Progress: 5156 on 8517  Progress: 5157 on 8517  Progress: 5158 on 8517  Progress: 5159 on 8517  Progress: 5160 on 8517  Progress: 5161 on 8517  Progress: 5162 on 8517  Progress: 5163 on 8517  Progress: 5164 on 8517  Progress: 5165 on 8517  Progress: 5166 on 8517  Progress: 5167 on 8517  Progress: 5168 on 8517  Progress: 5169 on 8517  Progress: 5170 on 8517  Progress: 5171 on 8517  Progress: 5172 on 8517  Progress: 5173 on 8517  Progress: 5174 on 8517  Progress: 5175 on 8517  Progress: 5176 on 8517  Progress: 5177 on 8517  Progress: 5178 on 8517  Progress: 5179 on 8517  Progress: 5180 on 8517  Progress: 5181 on 8517  Progress: 5182 on 8517  Progress: 5183 on 8517  Progress: 5184 on 8517  Progress: 5185 on 8517  Progress: 5186 on 8517  Progress: 5187 on 8517  Progress: 5188 on 8517  Progress: 5189 on 8517  Progress: 5190 on 8517  Progress: 5191 on 8517  Progress: 5192 on 8517  Progress: 5193 on 8517  Progress: 5194 on 8517  Progress: 5195 on 8517  Progress: 5196 on 8517  Progress: 5197 on 8517  Progress: 5198 on 8517  Progress: 5199 on 8517  Progress: 5200 on 8517  Progress: 5201 on 8517  Progress: 5202 on 8517  Progress: 5203 on 8517  Progress: 5204 on 8517  Progress: 5205 on 8517  Progress: 5206 on 8517  Progress: 5207 on 8517  Progress: 5208 on 8517  Progress: 5209 on 8517  Progress: 5210 on 8517  Progress: 5211 on 8517  Progress: 5212 on 8517  Progress: 5213 on 8517  Progress: 5214 on 8517  Progress: 5215 on 8517  Progress: 5216 on 8517  Progress: 5217 on 8517  Progress: 5218 on 8517  Progress: 5219 on 8517  Progress: 5220 on 8517  Progress: 5221 on 8517  Progress: 5222 on 8517  Progress: 5223 on 8517  Progress: 5224 on 8517  Progress: 5225 on 8517  Progress: 5226 on 8517  Progress: 5227 on 8517  Progress: 5228 on 8517  Progress: 5229 on 8517  Progress: 5230 on 8517  Progress: 5231 on 8517  Progress: 5232 on 8517  Progress: 5233 on 8517  Progress: 5234 on 8517  Progress: 5235 on 8517  Progress: 5236 on 8517  Progress: 5237 on 8517  Progress: 5238 on 8517  Progress: 5239 on 8517  Progress: 5240 on 8517  Progress: 5241 on 8517  Progress: 5242 on 8517  Progress: 5243 on 8517  Progress: 5244 on 8517  Progress: 5245 on 8517  Progress: 5246 on 8517  Progress: 5247 on 8517  Progress: 5248 on 8517  Progress: 5249 on 8517  Progress: 5250 on 8517  Progress: 5251 on 8517  Progress: 5252 on 8517  Progress: 5253 on 8517  Progress: 5254 on 8517  Progress: 5255 on 8517  Progress: 5256 on 8517  Progress: 5257 on 8517  Progress: 5258 on 8517  Progress: 5259 on 8517  Progress: 5260 on 8517  Progress: 5261 on 8517  Progress: 5262 on 8517  Progress: 5263 on 8517  Progress: 5264 on 8517  Progress: 5265 on 8517  Progress: 5266 on 8517  Progress: 5267 on 8517  Progress: 5268 on 8517  Progress: 5269 on 8517  Progress: 5270 on 8517  Progress: 5271 on 8517  Progress: 5272 on 8517  Progress: 5273 on 8517  Progress: 5274 on 8517  Progress: 5275 on 8517  Progress: 5276 on 8517  Progress: 5277 on 8517  Progress: 5278 on 8517  Progress: 5279 on 8517  Progress: 5280 on 8517  Progress: 5281 on 8517  Progress: 5282 on 8517  Progress: 5283 on 8517  Progress: 5284 on 8517  Progress: 5285 on 8517  Progress: 5286 on 8517  Progress: 5287 on 8517  Progress: 5288 on 8517  Progress: 5289 on 8517  Progress: 5290 on 8517  Progress: 5291 on 8517  Progress: 5292 on 8517  Progress: 5293 on 8517  Progress: 5294 on 8517  Progress: 5295 on 8517  Progress: 5296 on 8517  Progress: 5297 on 8517  Progress: 5298 on 8517  Progress: 5299 on 8517  Progress: 5300 on 8517  Progress: 5301 on 8517  Progress: 5302 on 8517  Progress: 5303 on 8517  Progress: 5304 on 8517  Progress: 5305 on 8517  Progress: 5306 on 8517  Progress: 5307 on 8517  Progress: 5308 on 8517  Progress: 5309 on 8517  Progress: 5310 on 8517  Progress: 5311 on 8517  Progress: 5312 on 8517  Progress: 5313 on 8517  Progress: 5314 on 8517  Progress: 5315 on 8517  Progress: 5316 on 8517  Progress: 5317 on 8517  Progress: 5318 on 8517  Progress: 5319 on 8517  Progress: 5320 on 8517  Progress: 5321 on 8517  Progress: 5322 on 8517  Progress: 5323 on 8517  Progress: 5324 on 8517  Progress: 5325 on 8517  Progress: 5326 on 8517  Progress: 5327 on 8517  Progress: 5328 on 8517  Progress: 5329 on 8517  Progress: 5330 on 8517  Progress: 5331 on 8517  Progress: 5332 on 8517  Progress: 5333 on 8517  Progress: 5334 on 8517  Progress: 5335 on 8517  Progress: 5336 on 8517  Progress: 5337 on 8517  Progress: 5338 on 8517  Progress: 5339 on 8517  Progress: 5340 on 8517  Progress: 5341 on 8517  Progress: 5342 on 8517  Progress: 5343 on 8517  Progress: 5344 on 8517  Progress: 5345 on 8517  Progress: 5346 on 8517  Progress: 5347 on 8517  Progress: 5348 on 8517  Progress: 5349 on 8517  Progress: 5350 on 8517  Progress: 5351 on 8517  Progress: 5352 on 8517  Progress: 5353 on 8517  Progress: 5354 on 8517  Progress: 5355 on 8517  Progress: 5356 on 8517  Progress: 5357 on 8517  Progress: 5358 on 8517  Progress: 5359 on 8517  Progress: 5360 on 8517  Progress: 5361 on 8517  Progress: 5362 on 8517  Progress: 5363 on 8517  Progress: 5364 on 8517  Progress: 5365 on 8517  Progress: 5366 on 8517  Progress: 5367 on 8517  Progress: 5368 on 8517  Progress: 5369 on 8517  Progress: 5370 on 8517  Progress: 5371 on 8517  Progress: 5372 on 8517  Progress: 5373 on 8517  Progress: 5374 on 8517  Progress: 5375 on 8517  Progress: 5376 on 8517  Progress: 5377 on 8517  Progress: 5378 on 8517  Progress: 5379 on 8517  Progress: 5380 on 8517  Progress: 5381 on 8517  Progress: 5382 on 8517  Progress: 5383 on 8517  Progress: 5384 on 8517  Progress: 5385 on 8517  Progress: 5386 on 8517  Progress: 5387 on 8517  Progress: 5388 on 8517  Progress: 5389 on 8517  Progress: 5390 on 8517  Progress: 5391 on 8517  Progress: 5392 on 8517  Progress: 5393 on 8517  Progress: 5394 on 8517  Progress: 5395 on 8517  Progress: 5396 on 8517  Progress: 5397 on 8517  Progress: 5398 on 8517  Progress: 5399 on 8517  Progress: 5400 on 8517  Progress: 5401 on 8517  Progress: 5402 on 8517  Progress: 5403 on 8517  Progress: 5404 on 8517  Progress: 5405 on 8517  Progress: 5406 on 8517  Progress: 5407 on 8517  Progress: 5408 on 8517  Progress: 5409 on 8517  Progress: 5410 on 8517  Progress: 5411 on 8517  Progress: 5412 on 8517  Progress: 5413 on 8517  Progress: 5414 on 8517  Progress: 5415 on 8517  Progress: 5416 on 8517  Progress: 5417 on 8517  Progress: 5418 on 8517  Progress: 5419 on 8517  Progress: 5420 on 8517  Progress: 5421 on 8517  Progress: 5422 on 8517  Progress: 5423 on 8517  Progress: 5424 on 8517  Progress: 5425 on 8517  Progress: 5426 on 8517  Progress: 5427 on 8517  Progress: 5428 on 8517  Progress: 5429 on 8517  Progress: 5430 on 8517  Progress: 5431 on 8517  Progress: 5432 on 8517  Progress: 5433 on 8517  Progress: 5434 on 8517  Progress: 5435 on 8517  Progress: 5436 on 8517  Progress: 5437 on 8517  Progress: 5438 on 8517  Progress: 5439 on 8517  Progress: 5440 on 8517  Progress: 5441 on 8517  Progress: 5442 on 8517  Progress: 5443 on 8517  Progress: 5444 on 8517  Progress: 5445 on 8517  Progress: 5446 on 8517  Progress: 5447 on 8517  Progress: 5448 on 8517  Progress: 5449 on 8517  Progress: 5450 on 8517  Progress: 5451 on 8517  Progress: 5452 on 8517  Progress: 5453 on 8517  Progress: 5454 on 8517  Progress: 5455 on 8517  Progress: 5456 on 8517  Progress: 5457 on 8517  Progress: 5458 on 8517  Progress: 5459 on 8517  Progress: 5460 on 8517  Progress: 5461 on 8517  Progress: 5462 on 8517  Progress: 5463 on 8517  Progress: 5464 on 8517  Progress: 5465 on 8517  Progress: 5466 on 8517  Progress: 5467 on 8517  Progress: 5468 on 8517  Progress: 5469 on 8517  Progress: 5470 on 8517  Progress: 5471 on 8517  Progress: 5472 on 8517  Progress: 5473 on 8517  Progress: 5474 on 8517  Progress: 5475 on 8517  Progress: 5476 on 8517  Progress: 5477 on 8517  Progress: 5478 on 8517  Progress: 5479 on 8517  Progress: 5480 on 8517  Progress: 5481 on 8517  Progress: 5482 on 8517  Progress: 5483 on 8517  Progress: 5484 on 8517  Progress: 5485 on 8517  Progress: 5486 on 8517  Progress: 5487 on 8517  Progress: 5488 on 8517  Progress: 5489 on 8517  Progress: 5490 on 8517  Progress: 5491 on 8517  Progress: 5492 on 8517  Progress: 5493 on 8517  Progress: 5494 on 8517  Progress: 5495 on 8517  Progress: 5496 on 8517  Progress: 5497 on 8517  Progress: 5498 on 8517  Progress: 5499 on 8517  Progress: 5500 on 8517  Progress: 5501 on 8517  Progress: 5502 on 8517  Progress: 5503 on 8517  Progress: 5504 on 8517  Progress: 5505 on 8517  Progress: 5506 on 8517  Progress: 5507 on 8517  Progress: 5508 on 8517  Progress: 5509 on 8517  Progress: 5510 on 8517  Progress: 5511 on 8517  Progress: 5512 on 8517  Progress: 5513 on 8517  Progress: 5514 on 8517  Progress: 5515 on 8517  Progress: 5516 on 8517  Progress: 5517 on 8517  Progress: 5518 on 8517  Progress: 5519 on 8517  Progress: 5520 on 8517  Progress: 5521 on 8517  Progress: 5522 on 8517  Progress: 5523 on 8517  Progress: 5524 on 8517  Progress: 5525 on 8517  Progress: 5526 on 8517  Progress: 5527 on 8517  Progress: 5528 on 8517  Progress: 5529 on 8517  Progress: 5530 on 8517  Progress: 5531 on 8517  Progress: 5532 on 8517  Progress: 5533 on 8517  Progress: 5534 on 8517  Progress: 5535 on 8517  Progress: 5536 on 8517  Progress: 5537 on 8517  Progress: 5538 on 8517  Progress: 5539 on 8517  Progress: 5540 on 8517  Progress: 5541 on 8517  Progress: 5542 on 8517  Progress: 5543 on 8517  Progress: 5544 on 8517  Progress: 5545 on 8517  Progress: 5546 on 8517  Progress: 5547 on 8517  Progress: 5548 on 8517  Progress: 5549 on 8517  Progress: 5550 on 8517  Progress: 5551 on 8517  Progress: 5552 on 8517  Progress: 5553 on 8517  Progress: 5554 on 8517  Progress: 5555 on 8517  Progress: 5556 on 8517  Progress: 5557 on 8517  Progress: 5558 on 8517  Progress: 5559 on 8517  Progress: 5560 on 8517  Progress: 5561 on 8517  Progress: 5562 on 8517  Progress: 5563 on 8517  Progress: 5564 on 8517  Progress: 5565 on 8517  Progress: 5566 on 8517  Progress: 5567 on 8517  Progress: 5568 on 8517  Progress: 5569 on 8517  Progress: 5570 on 8517  Progress: 5571 on 8517  Progress: 5572 on 8517  Progress: 5573 on 8517  Progress: 5574 on 8517  Progress: 5575 on 8517  Progress: 5576 on 8517  Progress: 5577 on 8517  Progress: 5578 on 8517  Progress: 5579 on 8517  Progress: 5580 on 8517  Progress: 5581 on 8517  Progress: 5582 on 8517  Progress: 5583 on 8517  Progress: 5584 on 8517  Progress: 5585 on 8517  Progress: 5586 on 8517  Progress: 5587 on 8517  Progress: 5588 on 8517  Progress: 5589 on 8517  Progress: 5590 on 8517  Progress: 5591 on 8517  Progress: 5592 on 8517  Progress: 5593 on 8517  Progress: 5594 on 8517  Progress: 5595 on 8517  Progress: 5596 on 8517  Progress: 5597 on 8517  Progress: 5598 on 8517  Progress: 5599 on 8517  Progress: 5600 on 8517  Progress: 5601 on 8517  Progress: 5602 on 8517  Progress: 5603 on 8517  Progress: 5604 on 8517  Progress: 5605 on 8517  Progress: 5606 on 8517  Progress: 5607 on 8517  Progress: 5608 on 8517  Progress: 5609 on 8517  Progress: 5610 on 8517  Progress: 5611 on 8517  Progress: 5612 on 8517  Progress: 5613 on 8517  Progress: 5614 on 8517  Progress: 5615 on 8517  Progress: 5616 on 8517  Progress: 5617 on 8517  Progress: 5618 on 8517  Progress: 5619 on 8517  Progress: 5620 on 8517  Progress: 5621 on 8517  Progress: 5622 on 8517  Progress: 5623 on 8517  Progress: 5624 on 8517  Progress: 5625 on 8517  Progress: 5626 on 8517  Progress: 5627 on 8517  Progress: 5628 on 8517  Progress: 5629 on 8517  Progress: 5630 on 8517  Progress: 5631 on 8517  Progress: 5632 on 8517  Progress: 5633 on 8517  Progress: 5634 on 8517  Progress: 5635 on 8517  Progress: 5636 on 8517  Progress: 5637 on 8517  Progress: 5638 on 8517  Progress: 5639 on 8517  Progress: 5640 on 8517  Progress: 5641 on 8517  Progress: 5642 on 8517  Progress: 5643 on 8517  Progress: 5644 on 8517  Progress: 5645 on 8517  Progress: 5646 on 8517  Progress: 5647 on 8517  Progress: 5648 on 8517  Progress: 5649 on 8517  Progress: 5650 on 8517  Progress: 5651 on 8517  Progress: 5652 on 8517  Progress: 5653 on 8517  Progress: 5654 on 8517  Progress: 5655 on 8517  Progress: 5656 on 8517  Progress: 5657 on 8517  Progress: 5658 on 8517  Progress: 5659 on 8517  Progress: 5660 on 8517  Progress: 5661 on 8517  Progress: 5662 on 8517  Progress: 5663 on 8517  Progress: 5664 on 8517  Progress: 5665 on 8517  Progress: 5666 on 8517  Progress: 5667 on 8517  Progress: 5668 on 8517  Progress: 5669 on 8517  Progress: 5670 on 8517  Progress: 5671 on 8517  Progress: 5672 on 8517  Progress: 5673 on 8517  Progress: 5674 on 8517  Progress: 5675 on 8517  Progress: 5676 on 8517  Progress: 5677 on 8517  Progress: 5678 on 8517  Progress: 5679 on 8517  Progress: 5680 on 8517  Progress: 5681 on 8517  Progress: 5682 on 8517  Progress: 5683 on 8517  Progress: 5684 on 8517  Progress: 5685 on 8517  Progress: 5686 on 8517  Progress: 5687 on 8517  Progress: 5688 on 8517  Progress: 5689 on 8517  Progress: 5690 on 8517  Progress: 5691 on 8517  Progress: 5692 on 8517  Progress: 5693 on 8517  Progress: 5694 on 8517  Progress: 5695 on 8517  Progress: 5696 on 8517  Progress: 5697 on 8517  Progress: 5698 on 8517  Progress: 5699 on 8517  Progress: 5700 on 8517  Progress: 5701 on 8517  Progress: 5702 on 8517  Progress: 5703 on 8517  Progress: 5704 on 8517  Progress: 5705 on 8517  Progress: 5706 on 8517  Progress: 5707 on 8517  Progress: 5708 on 8517  Progress: 5709 on 8517  Progress: 5710 on 8517  Progress: 5711 on 8517  Progress: 5712 on 8517  Progress: 5713 on 8517  Progress: 5714 on 8517  Progress: 5715 on 8517  Progress: 5716 on 8517  Progress: 5717 on 8517  Progress: 5718 on 8517  Progress: 5719 on 8517  Progress: 5720 on 8517  Progress: 5721 on 8517  Progress: 5722 on 8517  Progress: 5723 on 8517  Progress: 5724 on 8517  Progress: 5725 on 8517  Progress: 5726 on 8517  Progress: 5727 on 8517  Progress: 5728 on 8517  Progress: 5729 on 8517  Progress: 5730 on 8517  Progress: 5731 on 8517  Progress: 5732 on 8517  Progress: 5733 on 8517  Progress: 5734 on 8517  Progress: 5735 on 8517  Progress: 5736 on 8517  Progress: 5737 on 8517  Progress: 5738 on 8517  Progress: 5739 on 8517  Progress: 5740 on 8517  Progress: 5741 on 8517  Progress: 5742 on 8517  Progress: 5743 on 8517  Progress: 5744 on 8517  Progress: 5745 on 8517  Progress: 5746 on 8517  Progress: 5747 on 8517  Progress: 5748 on 8517  Progress: 5749 on 8517  Progress: 5750 on 8517  Progress: 5751 on 8517  Progress: 5752 on 8517  Progress: 5753 on 8517  Progress: 5754 on 8517  Progress: 5755 on 8517  Progress: 5756 on 8517  Progress: 5757 on 8517  Progress: 5758 on 8517  Progress: 5759 on 8517  Progress: 5760 on 8517  Progress: 5761 on 8517  Progress: 5762 on 8517  Progress: 5763 on 8517  Progress: 5764 on 8517  Progress: 5765 on 8517  Progress: 5766 on 8517  Progress: 5767 on 8517  Progress: 5768 on 8517  Progress: 5769 on 8517  Progress: 5770 on 8517  Progress: 5771 on 8517  Progress: 5772 on 8517  Progress: 5773 on 8517  Progress: 5774 on 8517  Progress: 5775 on 8517  Progress: 5776 on 8517  Progress: 5777 on 8517  Progress: 5778 on 8517  Progress: 5779 on 8517  Progress: 5780 on 8517  Progress: 5781 on 8517  Progress: 5782 on 8517  Progress: 5783 on 8517  Progress: 5784 on 8517  Progress: 5785 on 8517  Progress: 5786 on 8517  Progress: 5787 on 8517  Progress: 5788 on 8517  Progress: 5789 on 8517  Progress: 5790 on 8517  Progress: 5791 on 8517  Progress: 5792 on 8517  Progress: 5793 on 8517  Progress: 5794 on 8517  Progress: 5795 on 8517  Progress: 5796 on 8517  Progress: 5797 on 8517  Progress: 5798 on 8517  Progress: 5799 on 8517  Progress: 5800 on 8517  Progress: 5801 on 8517  Progress: 5802 on 8517  Progress: 5803 on 8517  Progress: 5804 on 8517  Progress: 5805 on 8517  Progress: 5806 on 8517  Progress: 5807 on 8517  Progress: 5808 on 8517  Progress: 5809 on 8517  Progress: 5810 on 8517  Progress: 5811 on 8517  Progress: 5812 on 8517  Progress: 5813 on 8517  Progress: 5814 on 8517  Progress: 5815 on 8517  Progress: 5816 on 8517  Progress: 5817 on 8517  Progress: 5818 on 8517  Progress: 5819 on 8517  Progress: 5820 on 8517  Progress: 5821 on 8517  Progress: 5822 on 8517  Progress: 5823 on 8517  Progress: 5824 on 8517  Progress: 5825 on 8517  Progress: 5826 on 8517  Progress: 5827 on 8517  Progress: 5828 on 8517  Progress: 5829 on 8517  Progress: 5830 on 8517  Progress: 5831 on 8517  Progress: 5832 on 8517  Progress: 5833 on 8517  Progress: 5834 on 8517  Progress: 5835 on 8517  Progress: 5836 on 8517  Progress: 5837 on 8517  Progress: 5838 on 8517  Progress: 5839 on 8517  Progress: 5840 on 8517  Progress: 5841 on 8517  Progress: 5842 on 8517  Progress: 5843 on 8517  Progress: 5844 on 8517  Progress: 5845 on 8517  Progress: 5846 on 8517  Progress: 5847 on 8517  Progress: 5848 on 8517  Progress: 5849 on 8517  Progress: 5850 on 8517  Progress: 5851 on 8517  Progress: 5852 on 8517  Progress: 5853 on 8517  Progress: 5854 on 8517  Progress: 5855 on 8517  Progress: 5856 on 8517  Progress: 5857 on 8517  Progress: 5858 on 8517  Progress: 5859 on 8517  Progress: 5860 on 8517  Progress: 5861 on 8517  Progress: 5862 on 8517  Progress: 5863 on 8517  Progress: 5864 on 8517  Progress: 5865 on 8517  Progress: 5866 on 8517  Progress: 5867 on 8517  Progress: 5868 on 8517  Progress: 5869 on 8517  Progress: 5870 on 8517  Progress: 5871 on 8517  Progress: 5872 on 8517  Progress: 5873 on 8517  Progress: 5874 on 8517  Progress: 5875 on 8517  Progress: 5876 on 8517  Progress: 5877 on 8517  Progress: 5878 on 8517  Progress: 5879 on 8517  Progress: 5880 on 8517  Progress: 5881 on 8517  Progress: 5882 on 8517  Progress: 5883 on 8517  Progress: 5884 on 8517  Progress: 5885 on 8517  Progress: 5886 on 8517  Progress: 5887 on 8517  Progress: 5888 on 8517  Progress: 5889 on 8517  Progress: 5890 on 8517  Progress: 5891 on 8517  Progress: 5892 on 8517  Progress: 5893 on 8517  Progress: 5894 on 8517  Progress: 5895 on 8517  Progress: 5896 on 8517  Progress: 5897 on 8517  Progress: 5898 on 8517  Progress: 5899 on 8517  Progress: 5900 on 8517  Progress: 5901 on 8517  Progress: 5902 on 8517  Progress: 5903 on 8517  Progress: 5904 on 8517  Progress: 5905 on 8517  Progress: 5906 on 8517  Progress: 5907 on 8517  Progress: 5908 on 8517  Progress: 5909 on 8517  Progress: 5910 on 8517  Progress: 5911 on 8517  Progress: 5912 on 8517  Progress: 5913 on 8517  Progress: 5914 on 8517  Progress: 5915 on 8517  Progress: 5916 on 8517  Progress: 5917 on 8517  Progress: 5918 on 8517  Progress: 5919 on 8517  Progress: 5920 on 8517  Progress: 5921 on 8517  Progress: 5922 on 8517  Progress: 5923 on 8517  Progress: 5924 on 8517  Progress: 5925 on 8517  Progress: 5926 on 8517  Progress: 5927 on 8517  Progress: 5928 on 8517  Progress: 5929 on 8517  Progress: 5930 on 8517  Progress: 5931 on 8517  Progress: 5932 on 8517  Progress: 5933 on 8517  Progress: 5934 on 8517  Progress: 5935 on 8517  Progress: 5936 on 8517  Progress: 5937 on 8517  Progress: 5938 on 8517  Progress: 5939 on 8517  Progress: 5940 on 8517  Progress: 5941 on 8517  Progress: 5942 on 8517  Progress: 5943 on 8517  Progress: 5944 on 8517  Progress: 5945 on 8517  Progress: 5946 on 8517  Progress: 5947 on 8517  Progress: 5948 on 8517  Progress: 5949 on 8517  Progress: 5950 on 8517  Progress: 5951 on 8517  Progress: 5952 on 8517  Progress: 5953 on 8517  Progress: 5954 on 8517  Progress: 5955 on 8517  Progress: 5956 on 8517  Progress: 5957 on 8517  Progress: 5958 on 8517  Progress: 5959 on 8517  Progress: 5960 on 8517  Progress: 5961 on 8517  Progress: 5962 on 8517  Progress: 5963 on 8517  Progress: 5964 on 8517  Progress: 5965 on 8517  Progress: 5966 on 8517  Progress: 5967 on 8517  Progress: 5968 on 8517  Progress: 5969 on 8517  Progress: 5970 on 8517  Progress: 5971 on 8517  Progress: 5972 on 8517  Progress: 5973 on 8517  Progress: 5974 on 8517  Progress: 5975 on 8517  Progress: 5976 on 8517  Progress: 5977 on 8517  Progress: 5978 on 8517  Progress: 5979 on 8517  Progress: 5980 on 8517  Progress: 5981 on 8517  Progress: 5982 on 8517  Progress: 5983 on 8517  Progress: 5984 on 8517  Progress: 5985 on 8517  Progress: 5986 on 8517  Progress: 5987 on 8517  Progress: 5988 on 8517  Progress: 5989 on 8517  Progress: 5990 on 8517  Progress: 5991 on 8517  Progress: 5992 on 8517  Progress: 5993 on 8517  Progress: 5994 on 8517  Progress: 5995 on 8517  Progress: 5996 on 8517  Progress: 5997 on 8517  Progress: 5998 on 8517  Progress: 5999 on 8517  Progress: 6000 on 8517  Progress: 6001 on 8517  Progress: 6002 on 8517  Progress: 6003 on 8517  Progress: 6004 on 8517  Progress: 6005 on 8517  Progress: 6006 on 8517  Progress: 6007 on 8517  Progress: 6008 on 8517  Progress: 6009 on 8517  Progress: 6010 on 8517  Progress: 6011 on 8517  Progress: 6012 on 8517  Progress: 6013 on 8517  Progress: 6014 on 8517  Progress: 6015 on 8517  Progress: 6016 on 8517  Progress: 6017 on 8517  Progress: 6018 on 8517  Progress: 6019 on 8517  Progress: 6020 on 8517  Progress: 6021 on 8517  Progress: 6022 on 8517  Progress: 6023 on 8517  Progress: 6024 on 8517  Progress: 6025 on 8517  Progress: 6026 on 8517  Progress: 6027 on 8517  Progress: 6028 on 8517  Progress: 6029 on 8517  Progress: 6030 on 8517  Progress: 6031 on 8517  Progress: 6032 on 8517  Progress: 6033 on 8517  Progress: 6034 on 8517  Progress: 6035 on 8517  Progress: 6036 on 8517  Progress: 6037 on 8517  Progress: 6038 on 8517  Progress: 6039 on 8517  Progress: 6040 on 8517  Progress: 6041 on 8517  Progress: 6042 on 8517  Progress: 6043 on 8517  Progress: 6044 on 8517  Progress: 6045 on 8517  Progress: 6046 on 8517  Progress: 6047 on 8517  Progress: 6048 on 8517  Progress: 6049 on 8517  Progress: 6050 on 8517  Progress: 6051 on 8517  Progress: 6052 on 8517  Progress: 6053 on 8517  Progress: 6054 on 8517  Progress: 6055 on 8517  Progress: 6056 on 8517  Progress: 6057 on 8517  Progress: 6058 on 8517  Progress: 6059 on 8517  Progress: 6060 on 8517  Progress: 6061 on 8517  Progress: 6062 on 8517  Progress: 6063 on 8517  Progress: 6064 on 8517  Progress: 6065 on 8517  Progress: 6066 on 8517  Progress: 6067 on 8517  Progress: 6068 on 8517  Progress: 6069 on 8517  Progress: 6070 on 8517  Progress: 6071 on 8517  Progress: 6072 on 8517  Progress: 6073 on 8517  Progress: 6074 on 8517  Progress: 6075 on 8517  Progress: 6076 on 8517  Progress: 6077 on 8517  Progress: 6078 on 8517  Progress: 6079 on 8517  Progress: 6080 on 8517  Progress: 6081 on 8517  Progress: 6082 on 8517  Progress: 6083 on 8517  Progress: 6084 on 8517  Progress: 6085 on 8517  Progress: 6086 on 8517  Progress: 6087 on 8517  Progress: 6088 on 8517  Progress: 6089 on 8517  Progress: 6090 on 8517  Progress: 6091 on 8517  Progress: 6092 on 8517  Progress: 6093 on 8517  Progress: 6094 on 8517  Progress: 6095 on 8517  Progress: 6096 on 8517  Progress: 6097 on 8517  Progress: 6098 on 8517  Progress: 6099 on 8517  Progress: 6100 on 8517  Progress: 6101 on 8517  Progress: 6102 on 8517  Progress: 6103 on 8517  Progress: 6104 on 8517  Progress: 6105 on 8517  Progress: 6106 on 8517  Progress: 6107 on 8517  Progress: 6108 on 8517  Progress: 6109 on 8517  Progress: 6110 on 8517  Progress: 6111 on 8517  Progress: 6112 on 8517  Progress: 6113 on 8517  Progress: 6114 on 8517  Progress: 6115 on 8517  Progress: 6116 on 8517  Progress: 6117 on 8517  Progress: 6118 on 8517  Progress: 6119 on 8517  Progress: 6120 on 8517  Progress: 6121 on 8517  Progress: 6122 on 8517  Progress: 6123 on 8517  Progress: 6124 on 8517  Progress: 6125 on 8517  Progress: 6126 on 8517  Progress: 6127 on 8517  Progress: 6128 on 8517  Progress: 6129 on 8517  Progress: 6130 on 8517  Progress: 6131 on 8517  Progress: 6132 on 8517  Progress: 6133 on 8517  Progress: 6134 on 8517  Progress: 6135 on 8517  Progress: 6136 on 8517  Progress: 6137 on 8517  Progress: 6138 on 8517  Progress: 6139 on 8517  Progress: 6140 on 8517  Progress: 6141 on 8517  Progress: 6142 on 8517  Progress: 6143 on 8517  Progress: 6144 on 8517  Progress: 6145 on 8517  Progress: 6146 on 8517  Progress: 6147 on 8517  Progress: 6148 on 8517  Progress: 6149 on 8517  Progress: 6150 on 8517  Progress: 6151 on 8517  Progress: 6152 on 8517  Progress: 6153 on 8517  Progress: 6154 on 8517  Progress: 6155 on 8517  Progress: 6156 on 8517  Progress: 6157 on 8517  Progress: 6158 on 8517  Progress: 6159 on 8517  Progress: 6160 on 8517  Progress: 6161 on 8517  Progress: 6162 on 8517  Progress: 6163 on 8517  Progress: 6164 on 8517  Progress: 6165 on 8517  Progress: 6166 on 8517  Progress: 6167 on 8517  Progress: 6168 on 8517  Progress: 6169 on 8517  Progress: 6170 on 8517  Progress: 6171 on 8517  Progress: 6172 on 8517  Progress: 6173 on 8517  Progress: 6174 on 8517  Progress: 6175 on 8517  Progress: 6176 on 8517  Progress: 6177 on 8517  Progress: 6178 on 8517  Progress: 6179 on 8517  Progress: 6180 on 8517  Progress: 6181 on 8517  Progress: 6182 on 8517  Progress: 6183 on 8517  Progress: 6184 on 8517  Progress: 6185 on 8517  Progress: 6186 on 8517  Progress: 6187 on 8517  Progress: 6188 on 8517  Progress: 6189 on 8517  Progress: 6190 on 8517  Progress: 6191 on 8517  Progress: 6192 on 8517  Progress: 6193 on 8517  Progress: 6194 on 8517  Progress: 6195 on 8517  Progress: 6196 on 8517  Progress: 6197 on 8517  Progress: 6198 on 8517  Progress: 6199 on 8517  Progress: 6200 on 8517  Progress: 6201 on 8517  Progress: 6202 on 8517  Progress: 6203 on 8517  Progress: 6204 on 8517  Progress: 6205 on 8517  Progress: 6206 on 8517  Progress: 6207 on 8517  Progress: 6208 on 8517  Progress: 6209 on 8517  Progress: 6210 on 8517  Progress: 6211 on 8517  Progress: 6212 on 8517  Progress: 6213 on 8517  Progress: 6214 on 8517  Progress: 6215 on 8517  Progress: 6216 on 8517  Progress: 6217 on 8517  Progress: 6218 on 8517  Progress: 6219 on 8517  Progress: 6220 on 8517  Progress: 6221 on 8517  Progress: 6222 on 8517  Progress: 6223 on 8517  Progress: 6224 on 8517  Progress: 6225 on 8517  Progress: 6226 on 8517  Progress: 6227 on 8517  Progress: 6228 on 8517  Progress: 6229 on 8517  Progress: 6230 on 8517  Progress: 6231 on 8517  Progress: 6232 on 8517  Progress: 6233 on 8517  Progress: 6234 on 8517  Progress: 6235 on 8517  Progress: 6236 on 8517  Progress: 6237 on 8517  Progress: 6238 on 8517  Progress: 6239 on 8517  Progress: 6240 on 8517  Progress: 6241 on 8517  Progress: 6242 on 8517  Progress: 6243 on 8517  Progress: 6244 on 8517  Progress: 6245 on 8517  Progress: 6246 on 8517  Progress: 6247 on 8517  Progress: 6248 on 8517  Progress: 6249 on 8517  Progress: 6250 on 8517  Progress: 6251 on 8517  Progress: 6252 on 8517  Progress: 6253 on 8517  Progress: 6254 on 8517  Progress: 6255 on 8517  Progress: 6256 on 8517  Progress: 6257 on 8517  Progress: 6258 on 8517  Progress: 6259 on 8517  Progress: 6260 on 8517  Progress: 6261 on 8517  Progress: 6262 on 8517  Progress: 6263 on 8517  Progress: 6264 on 8517  Progress: 6265 on 8517  Progress: 6266 on 8517  Progress: 6267 on 8517  Progress: 6268 on 8517  Progress: 6269 on 8517  Progress: 6270 on 8517  Progress: 6271 on 8517  Progress: 6272 on 8517  Progress: 6273 on 8517  Progress: 6274 on 8517  Progress: 6275 on 8517  Progress: 6276 on 8517  Progress: 6277 on 8517  Progress: 6278 on 8517  Progress: 6279 on 8517  Progress: 6280 on 8517  Progress: 6281 on 8517  Progress: 6282 on 8517  Progress: 6283 on 8517  Progress: 6284 on 8517  Progress: 6285 on 8517  Progress: 6286 on 8517  Progress: 6287 on 8517  Progress: 6288 on 8517  Progress: 6289 on 8517  Progress: 6290 on 8517  Progress: 6291 on 8517  Progress: 6292 on 8517  Progress: 6293 on 8517  Progress: 6294 on 8517  Progress: 6295 on 8517  Progress: 6296 on 8517  Progress: 6297 on 8517  Progress: 6298 on 8517  Progress: 6299 on 8517  Progress: 6300 on 8517  Progress: 6301 on 8517  Progress: 6302 on 8517  Progress: 6303 on 8517  Progress: 6304 on 8517  Progress: 6305 on 8517  Progress: 6306 on 8517  Progress: 6307 on 8517  Progress: 6308 on 8517  Progress: 6309 on 8517  Progress: 6310 on 8517  Progress: 6311 on 8517  Progress: 6312 on 8517  Progress: 6313 on 8517  Progress: 6314 on 8517  Progress: 6315 on 8517  Progress: 6316 on 8517  Progress: 6317 on 8517  Progress: 6318 on 8517  Progress: 6319 on 8517  Progress: 6320 on 8517  Progress: 6321 on 8517  Progress: 6322 on 8517  Progress: 6323 on 8517  Progress: 6324 on 8517  Progress: 6325 on 8517  Progress: 6326 on 8517  Progress: 6327 on 8517  Progress: 6328 on 8517  Progress: 6329 on 8517  Progress: 6330 on 8517  Progress: 6331 on 8517  Progress: 6332 on 8517  Progress: 6333 on 8517  Progress: 6334 on 8517  Progress: 6335 on 8517  Progress: 6336 on 8517  Progress: 6337 on 8517  Progress: 6338 on 8517  Progress: 6339 on 8517  Progress: 6340 on 8517  Progress: 6341 on 8517  Progress: 6342 on 8517  Progress: 6343 on 8517  Progress: 6344 on 8517  Progress: 6345 on 8517  Progress: 6346 on 8517  Progress: 6347 on 8517  Progress: 6348 on 8517  Progress: 6349 on 8517  Progress: 6350 on 8517  Progress: 6351 on 8517  Progress: 6352 on 8517  Progress: 6353 on 8517  Progress: 6354 on 8517  Progress: 6355 on 8517  Progress: 6356 on 8517  Progress: 6357 on 8517  Progress: 6358 on 8517  Progress: 6359 on 8517  Progress: 6360 on 8517  Progress: 6361 on 8517  Progress: 6362 on 8517  Progress: 6363 on 8517  Progress: 6364 on 8517  Progress: 6365 on 8517  Progress: 6366 on 8517  Progress: 6367 on 8517  Progress: 6368 on 8517  Progress: 6369 on 8517  Progress: 6370 on 8517  Progress: 6371 on 8517  Progress: 6372 on 8517  Progress: 6373 on 8517  Progress: 6374 on 8517  Progress: 6375 on 8517  Progress: 6376 on 8517  Progress: 6377 on 8517  Progress: 6378 on 8517  Progress: 6379 on 8517  Progress: 6380 on 8517  Progress: 6381 on 8517  Progress: 6382 on 8517  Progress: 6383 on 8517  Progress: 6384 on 8517  Progress: 6385 on 8517  Progress: 6386 on 8517  Progress: 6387 on 8517  Progress: 6388 on 8517  Progress: 6389 on 8517  Progress: 6390 on 8517  Progress: 6391 on 8517  Progress: 6392 on 8517  Progress: 6393 on 8517  Progress: 6394 on 8517  Progress: 6395 on 8517  Progress: 6396 on 8517  Progress: 6397 on 8517  Progress: 6398 on 8517  Progress: 6399 on 8517  Progress: 6400 on 8517  Progress: 6401 on 8517  Progress: 6402 on 8517  Progress: 6403 on 8517  Progress: 6404 on 8517  Progress: 6405 on 8517  Progress: 6406 on 8517  Progress: 6407 on 8517  Progress: 6408 on 8517  Progress: 6409 on 8517  Progress: 6410 on 8517  Progress: 6411 on 8517  Progress: 6412 on 8517  Progress: 6413 on 8517  Progress: 6414 on 8517  Progress: 6415 on 8517  Progress: 6416 on 8517  Progress: 6417 on 8517  Progress: 6418 on 8517  Progress: 6419 on 8517  Progress: 6420 on 8517  Progress: 6421 on 8517  Progress: 6422 on 8517  Progress: 6423 on 8517  Progress: 6424 on 8517  Progress: 6425 on 8517  Progress: 6426 on 8517  Progress: 6427 on 8517  Progress: 6428 on 8517  Progress: 6429 on 8517  Progress: 6430 on 8517  Progress: 6431 on 8517  Progress: 6432 on 8517  Progress: 6433 on 8517  Progress: 6434 on 8517  Progress: 6435 on 8517  Progress: 6436 on 8517  Progress: 6437 on 8517  Progress: 6438 on 8517  Progress: 6439 on 8517  Progress: 6440 on 8517  Progress: 6441 on 8517  Progress: 6442 on 8517  Progress: 6443 on 8517  Progress: 6444 on 8517  Progress: 6445 on 8517  Progress: 6446 on 8517  Progress: 6447 on 8517  Progress: 6448 on 8517  Progress: 6449 on 8517  Progress: 6450 on 8517  Progress: 6451 on 8517  Progress: 6452 on 8517  Progress: 6453 on 8517  Progress: 6454 on 8517  Progress: 6455 on 8517  Progress: 6456 on 8517  Progress: 6457 on 8517  Progress: 6458 on 8517  Progress: 6459 on 8517  Progress: 6460 on 8517  Progress: 6461 on 8517  Progress: 6462 on 8517  Progress: 6463 on 8517  Progress: 6464 on 8517  Progress: 6465 on 8517  Progress: 6466 on 8517  Progress: 6467 on 8517  Progress: 6468 on 8517  Progress: 6469 on 8517  Progress: 6470 on 8517  Progress: 6471 on 8517  Progress: 6472 on 8517  Progress: 6473 on 8517  Progress: 6474 on 8517  Progress: 6475 on 8517  Progress: 6476 on 8517  Progress: 6477 on 8517  Progress: 6478 on 8517  Progress: 6479 on 8517  Progress: 6480 on 8517  Progress: 6481 on 8517  Progress: 6482 on 8517  Progress: 6483 on 8517  Progress: 6484 on 8517  Progress: 6485 on 8517  Progress: 6486 on 8517  Progress: 6487 on 8517  Progress: 6488 on 8517  Progress: 6489 on 8517  Progress: 6490 on 8517  Progress: 6491 on 8517  Progress: 6492 on 8517  Progress: 6493 on 8517  Progress: 6494 on 8517  Progress: 6495 on 8517  Progress: 6496 on 8517  Progress: 6497 on 8517  Progress: 6498 on 8517  Progress: 6499 on 8517  Progress: 6500 on 8517  Progress: 6501 on 8517  Progress: 6502 on 8517  Progress: 6503 on 8517  Progress: 6504 on 8517  Progress: 6505 on 8517  Progress: 6506 on 8517  Progress: 6507 on 8517  Progress: 6508 on 8517  Progress: 6509 on 8517  Progress: 6510 on 8517  Progress: 6511 on 8517  Progress: 6512 on 8517  Progress: 6513 on 8517  Progress: 6514 on 8517  Progress: 6515 on 8517  Progress: 6516 on 8517  Progress: 6517 on 8517  Progress: 6518 on 8517  Progress: 6519 on 8517  Progress: 6520 on 8517  Progress: 6521 on 8517  Progress: 6522 on 8517  Progress: 6523 on 8517  Progress: 6524 on 8517  Progress: 6525 on 8517  Progress: 6526 on 8517  Progress: 6527 on 8517  Progress: 6528 on 8517  Progress: 6529 on 8517  Progress: 6530 on 8517  Progress: 6531 on 8517  Progress: 6532 on 8517  Progress: 6533 on 8517  Progress: 6534 on 8517  Progress: 6535 on 8517  Progress: 6536 on 8517  Progress: 6537 on 8517  Progress: 6538 on 8517  Progress: 6539 on 8517  Progress: 6540 on 8517  Progress: 6541 on 8517  Progress: 6542 on 8517  Progress: 6543 on 8517  Progress: 6544 on 8517  Progress: 6545 on 8517  Progress: 6546 on 8517  Progress: 6547 on 8517  Progress: 6548 on 8517  Progress: 6549 on 8517  Progress: 6550 on 8517  Progress: 6551 on 8517  Progress: 6552 on 8517  Progress: 6553 on 8517  Progress: 6554 on 8517  Progress: 6555 on 8517  Progress: 6556 on 8517  Progress: 6557 on 8517  Progress: 6558 on 8517  Progress: 6559 on 8517  Progress: 6560 on 8517  Progress: 6561 on 8517  Progress: 6562 on 8517  Progress: 6563 on 8517  Progress: 6564 on 8517  Progress: 6565 on 8517  Progress: 6566 on 8517  Progress: 6567 on 8517  Progress: 6568 on 8517  Progress: 6569 on 8517  Progress: 6570 on 8517  Progress: 6571 on 8517  Progress: 6572 on 8517  Progress: 6573 on 8517  Progress: 6574 on 8517  Progress: 6575 on 8517  Progress: 6576 on 8517  Progress: 6577 on 8517  Progress: 6578 on 8517  Progress: 6579 on 8517  Progress: 6580 on 8517  Progress: 6581 on 8517  Progress: 6582 on 8517  Progress: 6583 on 8517  Progress: 6584 on 8517  Progress: 6585 on 8517  Progress: 6586 on 8517  Progress: 6587 on 8517  Progress: 6588 on 8517  Progress: 6589 on 8517  Progress: 6590 on 8517  Progress: 6591 on 8517  Progress: 6592 on 8517  Progress: 6593 on 8517  Progress: 6594 on 8517  Progress: 6595 on 8517  Progress: 6596 on 8517  Progress: 6597 on 8517  Progress: 6598 on 8517  Progress: 6599 on 8517  Progress: 6600 on 8517  Progress: 6601 on 8517  Progress: 6602 on 8517  Progress: 6603 on 8517  Progress: 6604 on 8517  Progress: 6605 on 8517  Progress: 6606 on 8517  Progress: 6607 on 8517  Progress: 6608 on 8517  Progress: 6609 on 8517  Progress: 6610 on 8517  Progress: 6611 on 8517  Progress: 6612 on 8517  Progress: 6613 on 8517  Progress: 6614 on 8517  Progress: 6615 on 8517  Progress: 6616 on 8517  Progress: 6617 on 8517  Progress: 6618 on 8517  Progress: 6619 on 8517  Progress: 6620 on 8517  Progress: 6621 on 8517  Progress: 6622 on 8517  Progress: 6623 on 8517  Progress: 6624 on 8517  Progress: 6625 on 8517  Progress: 6626 on 8517  Progress: 6627 on 8517  Progress: 6628 on 8517  Progress: 6629 on 8517  Progress: 6630 on 8517  Progress: 6631 on 8517  Progress: 6632 on 8517  Progress: 6633 on 8517  Progress: 6634 on 8517  Progress: 6635 on 8517  Progress: 6636 on 8517  Progress: 6637 on 8517  Progress: 6638 on 8517  Progress: 6639 on 8517  Progress: 6640 on 8517  Progress: 6641 on 8517  Progress: 6642 on 8517  Progress: 6643 on 8517  Progress: 6644 on 8517  Progress: 6645 on 8517  Progress: 6646 on 8517  Progress: 6647 on 8517  Progress: 6648 on 8517  Progress: 6649 on 8517  Progress: 6650 on 8517  Progress: 6651 on 8517  Progress: 6652 on 8517  Progress: 6653 on 8517  Progress: 6654 on 8517  Progress: 6655 on 8517  Progress: 6656 on 8517  Progress: 6657 on 8517  Progress: 6658 on 8517  Progress: 6659 on 8517  Progress: 6660 on 8517  Progress: 6661 on 8517  Progress: 6662 on 8517  Progress: 6663 on 8517  Progress: 6664 on 8517  Progress: 6665 on 8517  Progress: 6666 on 8517  Progress: 6667 on 8517  Progress: 6668 on 8517  Progress: 6669 on 8517  Progress: 6670 on 8517  Progress: 6671 on 8517  Progress: 6672 on 8517  Progress: 6673 on 8517  Progress: 6674 on 8517  Progress: 6675 on 8517  Progress: 6676 on 8517  Progress: 6677 on 8517  Progress: 6678 on 8517  Progress: 6679 on 8517  Progress: 6680 on 8517  Progress: 6681 on 8517  Progress: 6682 on 8517  Progress: 6683 on 8517  Progress: 6684 on 8517  Progress: 6685 on 8517  Progress: 6686 on 8517  Progress: 6687 on 8517  Progress: 6688 on 8517  Progress: 6689 on 8517  Progress: 6690 on 8517  Progress: 6691 on 8517  Progress: 6692 on 8517  Progress: 6693 on 8517  Progress: 6694 on 8517  Progress: 6695 on 8517  Progress: 6696 on 8517  Progress: 6697 on 8517  Progress: 6698 on 8517  Progress: 6699 on 8517  Progress: 6700 on 8517  Progress: 6701 on 8517  Progress: 6702 on 8517  Progress: 6703 on 8517  Progress: 6704 on 8517  Progress: 6705 on 8517  Progress: 6706 on 8517  Progress: 6707 on 8517  Progress: 6708 on 8517  Progress: 6709 on 8517  Progress: 6710 on 8517  Progress: 6711 on 8517  Progress: 6712 on 8517  Progress: 6713 on 8517  Progress: 6714 on 8517  Progress: 6715 on 8517  Progress: 6716 on 8517  Progress: 6717 on 8517  Progress: 6718 on 8517  Progress: 6719 on 8517  Progress: 6720 on 8517  Progress: 6721 on 8517  Progress: 6722 on 8517  Progress: 6723 on 8517  Progress: 6724 on 8517  Progress: 6725 on 8517  Progress: 6726 on 8517  Progress: 6727 on 8517  Progress: 6728 on 8517  Progress: 6729 on 8517  Progress: 6730 on 8517  Progress: 6731 on 8517  Progress: 6732 on 8517  Progress: 6733 on 8517  Progress: 6734 on 8517  Progress: 6735 on 8517  Progress: 6736 on 8517  Progress: 6737 on 8517  Progress: 6738 on 8517  Progress: 6739 on 8517  Progress: 6740 on 8517  Progress: 6741 on 8517  Progress: 6742 on 8517  Progress: 6743 on 8517  Progress: 6744 on 8517  Progress: 6745 on 8517  Progress: 6746 on 8517  Progress: 6747 on 8517  Progress: 6748 on 8517  Progress: 6749 on 8517  Progress: 6750 on 8517  Progress: 6751 on 8517  Progress: 6752 on 8517  Progress: 6753 on 8517  Progress: 6754 on 8517  Progress: 6755 on 8517  Progress: 6756 on 8517  Progress: 6757 on 8517  Progress: 6758 on 8517  Progress: 6759 on 8517  Progress: 6760 on 8517  Progress: 6761 on 8517  Progress: 6762 on 8517  Progress: 6763 on 8517  Progress: 6764 on 8517  Progress: 6765 on 8517  Progress: 6766 on 8517  Progress: 6767 on 8517  Progress: 6768 on 8517  Progress: 6769 on 8517  Progress: 6770 on 8517  Progress: 6771 on 8517  Progress: 6772 on 8517  Progress: 6773 on 8517  Progress: 6774 on 8517  Progress: 6775 on 8517  Progress: 6776 on 8517  Progress: 6777 on 8517  Progress: 6778 on 8517  Progress: 6779 on 8517  Progress: 6780 on 8517  Progress: 6781 on 8517  Progress: 6782 on 8517  Progress: 6783 on 8517  Progress: 6784 on 8517  Progress: 6785 on 8517  Progress: 6786 on 8517  Progress: 6787 on 8517  Progress: 6788 on 8517  Progress: 6789 on 8517  Progress: 6790 on 8517  Progress: 6791 on 8517  Progress: 6792 on 8517  Progress: 6793 on 8517  Progress: 6794 on 8517  Progress: 6795 on 8517  Progress: 6796 on 8517  Progress: 6797 on 8517  Progress: 6798 on 8517  Progress: 6799 on 8517  Progress: 6800 on 8517  Progress: 6801 on 8517  Progress: 6802 on 8517  Progress: 6803 on 8517  Progress: 6804 on 8517  Progress: 6805 on 8517  Progress: 6806 on 8517  Progress: 6807 on 8517  Progress: 6808 on 8517  Progress: 6809 on 8517  Progress: 6810 on 8517  Progress: 6811 on 8517  Progress: 6812 on 8517  Progress: 6813 on 8517  Progress: 6814 on 8517  Progress: 6815 on 8517  Progress: 6816 on 8517  Progress: 6817 on 8517  Progress: 6818 on 8517  Progress: 6819 on 8517  Progress: 6820 on 8517  Progress: 6821 on 8517  Progress: 6822 on 8517  Progress: 6823 on 8517  Progress: 6824 on 8517  Progress: 6825 on 8517  Progress: 6826 on 8517  Progress: 6827 on 8517  Progress: 6828 on 8517  Progress: 6829 on 8517  Progress: 6830 on 8517  Progress: 6831 on 8517  Progress: 6832 on 8517  Progress: 6833 on 8517  Progress: 6834 on 8517  Progress: 6835 on 8517  Progress: 6836 on 8517  Progress: 6837 on 8517  Progress: 6838 on 8517  Progress: 6839 on 8517  Progress: 6840 on 8517  Progress: 6841 on 8517  Progress: 6842 on 8517  Progress: 6843 on 8517  Progress: 6844 on 8517  Progress: 6845 on 8517  Progress: 6846 on 8517  Progress: 6847 on 8517  Progress: 6848 on 8517  Progress: 6849 on 8517  Progress: 6850 on 8517  Progress: 6851 on 8517  Progress: 6852 on 8517  Progress: 6853 on 8517  Progress: 6854 on 8517  Progress: 6855 on 8517  Progress: 6856 on 8517  Progress: 6857 on 8517  Progress: 6858 on 8517  Progress: 6859 on 8517  Progress: 6860 on 8517  Progress: 6861 on 8517  Progress: 6862 on 8517  Progress: 6863 on 8517  Progress: 6864 on 8517  Progress: 6865 on 8517  Progress: 6866 on 8517  Progress: 6867 on 8517  Progress: 6868 on 8517  Progress: 6869 on 8517  Progress: 6870 on 8517  Progress: 6871 on 8517  Progress: 6872 on 8517  Progress: 6873 on 8517  Progress: 6874 on 8517  Progress: 6875 on 8517  Progress: 6876 on 8517  Progress: 6877 on 8517  Progress: 6878 on 8517  Progress: 6879 on 8517  Progress: 6880 on 8517  Progress: 6881 on 8517  Progress: 6882 on 8517  Progress: 6883 on 8517  Progress: 6884 on 8517  Progress: 6885 on 8517  Progress: 6886 on 8517  Progress: 6887 on 8517  Progress: 6888 on 8517  Progress: 6889 on 8517  Progress: 6890 on 8517  Progress: 6891 on 8517  Progress: 6892 on 8517  Progress: 6893 on 8517  Progress: 6894 on 8517  Progress: 6895 on 8517  Progress: 6896 on 8517  Progress: 6897 on 8517  Progress: 6898 on 8517  Progress: 6899 on 8517  Progress: 6900 on 8517  Progress: 6901 on 8517  Progress: 6902 on 8517  Progress: 6903 on 8517  Progress: 6904 on 8517  Progress: 6905 on 8517  Progress: 6906 on 8517  Progress: 6907 on 8517  Progress: 6908 on 8517  Progress: 6909 on 8517  Progress: 6910 on 8517  Progress: 6911 on 8517  Progress: 6912 on 8517  Progress: 6913 on 8517  Progress: 6914 on 8517  Progress: 6915 on 8517  Progress: 6916 on 8517  Progress: 6917 on 8517  Progress: 6918 on 8517  Progress: 6919 on 8517  Progress: 6920 on 8517  Progress: 6921 on 8517  Progress: 6922 on 8517  Progress: 6923 on 8517  Progress: 6924 on 8517  Progress: 6925 on 8517  Progress: 6926 on 8517  Progress: 6927 on 8517  Progress: 6928 on 8517  Progress: 6929 on 8517  Progress: 6930 on 8517  Progress: 6931 on 8517  Progress: 6932 on 8517  Progress: 6933 on 8517  Progress: 6934 on 8517  Progress: 6935 on 8517  Progress: 6936 on 8517  Progress: 6937 on 8517  Progress: 6938 on 8517  Progress: 6939 on 8517  Progress: 6940 on 8517  Progress: 6941 on 8517  Progress: 6942 on 8517  Progress: 6943 on 8517  Progress: 6944 on 8517  Progress: 6945 on 8517  Progress: 6946 on 8517  Progress: 6947 on 8517  Progress: 6948 on 8517  Progress: 6949 on 8517  Progress: 6950 on 8517  Progress: 6951 on 8517  Progress: 6952 on 8517  Progress: 6953 on 8517  Progress: 6954 on 8517  Progress: 6955 on 8517  Progress: 6956 on 8517  Progress: 6957 on 8517  Progress: 6958 on 8517  Progress: 6959 on 8517  Progress: 6960 on 8517  Progress: 6961 on 8517  Progress: 6962 on 8517  Progress: 6963 on 8517  Progress: 6964 on 8517  Progress: 6965 on 8517  Progress: 6966 on 8517  Progress: 6967 on 8517  Progress: 6968 on 8517  Progress: 6969 on 8517  Progress: 6970 on 8517  Progress: 6971 on 8517  Progress: 6972 on 8517  Progress: 6973 on 8517  Progress: 6974 on 8517  Progress: 6975 on 8517  Progress: 6976 on 8517  Progress: 6977 on 8517  Progress: 6978 on 8517  Progress: 6979 on 8517  Progress: 6980 on 8517  Progress: 6981 on 8517  Progress: 6982 on 8517  Progress: 6983 on 8517  Progress: 6984 on 8517  Progress: 6985 on 8517  Progress: 6986 on 8517  Progress: 6987 on 8517  Progress: 6988 on 8517  Progress: 6989 on 8517  Progress: 6990 on 8517  Progress: 6991 on 8517  Progress: 6992 on 8517  Progress: 6993 on 8517  Progress: 6994 on 8517  Progress: 6995 on 8517  Progress: 6996 on 8517  Progress: 6997 on 8517  Progress: 6998 on 8517  Progress: 6999 on 8517  Progress: 7000 on 8517  Progress: 7001 on 8517  Progress: 7002 on 8517  Progress: 7003 on 8517  Progress: 7004 on 8517  Progress: 7005 on 8517  Progress: 7006 on 8517  Progress: 7007 on 8517  Progress: 7008 on 8517  Progress: 7009 on 8517  Progress: 7010 on 8517  Progress: 7011 on 8517  Progress: 7012 on 8517  Progress: 7013 on 8517  Progress: 7014 on 8517  Progress: 7015 on 8517  Progress: 7016 on 8517  Progress: 7017 on 8517  Progress: 7018 on 8517  Progress: 7019 on 8517  Progress: 7020 on 8517  Progress: 7021 on 8517  Progress: 7022 on 8517  Progress: 7023 on 8517  Progress: 7024 on 8517  Progress: 7025 on 8517  Progress: 7026 on 8517  Progress: 7027 on 8517  Progress: 7028 on 8517  Progress: 7029 on 8517  Progress: 7030 on 8517  Progress: 7031 on 8517  Progress: 7032 on 8517  Progress: 7033 on 8517  Progress: 7034 on 8517  Progress: 7035 on 8517  Progress: 7036 on 8517  Progress: 7037 on 8517  Progress: 7038 on 8517  Progress: 7039 on 8517  Progress: 7040 on 8517  Progress: 7041 on 8517  Progress: 7042 on 8517  Progress: 7043 on 8517  Progress: 7044 on 8517  Progress: 7045 on 8517  Progress: 7046 on 8517  Progress: 7047 on 8517  Progress: 7048 on 8517  Progress: 7049 on 8517  Progress: 7050 on 8517  Progress: 7051 on 8517  Progress: 7052 on 8517  Progress: 7053 on 8517  Progress: 7054 on 8517  Progress: 7055 on 8517  Progress: 7056 on 8517  Progress: 7057 on 8517  Progress: 7058 on 8517  Progress: 7059 on 8517  Progress: 7060 on 8517  Progress: 7061 on 8517  Progress: 7062 on 8517  Progress: 7063 on 8517  Progress: 7064 on 8517  Progress: 7065 on 8517  Progress: 7066 on 8517  Progress: 7067 on 8517  Progress: 7068 on 8517  Progress: 7069 on 8517  Progress: 7070 on 8517  Progress: 7071 on 8517  Progress: 7072 on 8517  Progress: 7073 on 8517  Progress: 7074 on 8517  Progress: 7075 on 8517  Progress: 7076 on 8517  Progress: 7077 on 8517  Progress: 7078 on 8517  Progress: 7079 on 8517  Progress: 7080 on 8517  Progress: 7081 on 8517  Progress: 7082 on 8517  Progress: 7083 on 8517  Progress: 7084 on 8517  Progress: 7085 on 8517  Progress: 7086 on 8517  Progress: 7087 on 8517  Progress: 7088 on 8517  Progress: 7089 on 8517  Progress: 7090 on 8517  Progress: 7091 on 8517  Progress: 7092 on 8517  Progress: 7093 on 8517  Progress: 7094 on 8517  Progress: 7095 on 8517  Progress: 7096 on 8517  Progress: 7097 on 8517  Progress: 7098 on 8517  Progress: 7099 on 8517  Progress: 7100 on 8517  Progress: 7101 on 8517  Progress: 7102 on 8517  Progress: 7103 on 8517  Progress: 7104 on 8517  Progress: 7105 on 8517  Progress: 7106 on 8517  Progress: 7107 on 8517  Progress: 7108 on 8517  Progress: 7109 on 8517  Progress: 7110 on 8517  Progress: 7111 on 8517  Progress: 7112 on 8517  Progress: 7113 on 8517  Progress: 7114 on 8517  Progress: 7115 on 8517  Progress: 7116 on 8517  Progress: 7117 on 8517  Progress: 7118 on 8517  Progress: 7119 on 8517  Progress: 7120 on 8517  Progress: 7121 on 8517  Progress: 7122 on 8517  Progress: 7123 on 8517  Progress: 7124 on 8517  Progress: 7125 on 8517  Progress: 7126 on 8517  Progress: 7127 on 8517  Progress: 7128 on 8517  Progress: 7129 on 8517  Progress: 7130 on 8517  Progress: 7131 on 8517  Progress: 7132 on 8517  Progress: 7133 on 8517  Progress: 7134 on 8517  Progress: 7135 on 8517  Progress: 7136 on 8517  Progress: 7137 on 8517  Progress: 7138 on 8517  Progress: 7139 on 8517  Progress: 7140 on 8517  Progress: 7141 on 8517  Progress: 7142 on 8517  Progress: 7143 on 8517  Progress: 7144 on 8517  Progress: 7145 on 8517  Progress: 7146 on 8517  Progress: 7147 on 8517  Progress: 7148 on 8517  Progress: 7149 on 8517  Progress: 7150 on 8517  Progress: 7151 on 8517  Progress: 7152 on 8517  Progress: 7153 on 8517  Progress: 7154 on 8517  Progress: 7155 on 8517  Progress: 7156 on 8517  Progress: 7157 on 8517  Progress: 7158 on 8517  Progress: 7159 on 8517  Progress: 7160 on 8517  Progress: 7161 on 8517  Progress: 7162 on 8517  Progress: 7163 on 8517  Progress: 7164 on 8517  Progress: 7165 on 8517  Progress: 7166 on 8517  Progress: 7167 on 8517  Progress: 7168 on 8517  Progress: 7169 on 8517  Progress: 7170 on 8517  Progress: 7171 on 8517  Progress: 7172 on 8517  Progress: 7173 on 8517  Progress: 7174 on 8517  Progress: 7175 on 8517  Progress: 7176 on 8517  Progress: 7177 on 8517  Progress: 7178 on 8517  Progress: 7179 on 8517  Progress: 7180 on 8517  Progress: 7181 on 8517  Progress: 7182 on 8517  Progress: 7183 on 8517  Progress: 7184 on 8517  Progress: 7185 on 8517  Progress: 7186 on 8517  Progress: 7187 on 8517  Progress: 7188 on 8517  Progress: 7189 on 8517  Progress: 7190 on 8517  Progress: 7191 on 8517  Progress: 7192 on 8517  Progress: 7193 on 8517  Progress: 7194 on 8517  Progress: 7195 on 8517  Progress: 7196 on 8517  Progress: 7197 on 8517  Progress: 7198 on 8517  Progress: 7199 on 8517  Progress: 7200 on 8517  Progress: 7201 on 8517  Progress: 7202 on 8517  Progress: 7203 on 8517  Progress: 7204 on 8517  Progress: 7205 on 8517  Progress: 7206 on 8517  Progress: 7207 on 8517  Progress: 7208 on 8517  Progress: 7209 on 8517  Progress: 7210 on 8517  Progress: 7211 on 8517  Progress: 7212 on 8517  Progress: 7213 on 8517  Progress: 7214 on 8517  Progress: 7215 on 8517  Progress: 7216 on 8517  Progress: 7217 on 8517  Progress: 7218 on 8517  Progress: 7219 on 8517  Progress: 7220 on 8517  Progress: 7221 on 8517  Progress: 7222 on 8517  Progress: 7223 on 8517  Progress: 7224 on 8517  Progress: 7225 on 8517  Progress: 7226 on 8517  Progress: 7227 on 8517  Progress: 7228 on 8517  Progress: 7229 on 8517  Progress: 7230 on 8517  Progress: 7231 on 8517  Progress: 7232 on 8517  Progress: 7233 on 8517  Progress: 7234 on 8517  Progress: 7235 on 8517  Progress: 7236 on 8517  Progress: 7237 on 8517  Progress: 7238 on 8517  Progress: 7239 on 8517  Progress: 7240 on 8517  Progress: 7241 on 8517  Progress: 7242 on 8517  Progress: 7243 on 8517  Progress: 7244 on 8517  Progress: 7245 on 8517  Progress: 7246 on 8517  Progress: 7247 on 8517  Progress: 7248 on 8517  Progress: 7249 on 8517  Progress: 7250 on 8517  Progress: 7251 on 8517  Progress: 7252 on 8517  Progress: 7253 on 8517  Progress: 7254 on 8517  Progress: 7255 on 8517  Progress: 7256 on 8517  Progress: 7257 on 8517  Progress: 7258 on 8517  Progress: 7259 on 8517  Progress: 7260 on 8517  Progress: 7261 on 8517  Progress: 7262 on 8517  Progress: 7263 on 8517  Progress: 7264 on 8517  Progress: 7265 on 8517  Progress: 7266 on 8517  Progress: 7267 on 8517  Progress: 7268 on 8517  Progress: 7269 on 8517  Progress: 7270 on 8517  Progress: 7271 on 8517  Progress: 7272 on 8517  Progress: 7273 on 8517  Progress: 7274 on 8517  Progress: 7275 on 8517  Progress: 7276 on 8517  Progress: 7277 on 8517  Progress: 7278 on 8517  Progress: 7279 on 8517  Progress: 7280 on 8517  Progress: 7281 on 8517  Progress: 7282 on 8517  Progress: 7283 on 8517  Progress: 7284 on 8517  Progress: 7285 on 8517  Progress: 7286 on 8517  Progress: 7287 on 8517  Progress: 7288 on 8517  Progress: 7289 on 8517  Progress: 7290 on 8517  Progress: 7291 on 8517  Progress: 7292 on 8517  Progress: 7293 on 8517  Progress: 7294 on 8517  Progress: 7295 on 8517  Progress: 7296 on 8517  Progress: 7297 on 8517  Progress: 7298 on 8517  Progress: 7299 on 8517  Progress: 7300 on 8517  Progress: 7301 on 8517  Progress: 7302 on 8517  Progress: 7303 on 8517  Progress: 7304 on 8517  Progress: 7305 on 8517  Progress: 7306 on 8517  Progress: 7307 on 8517  Progress: 7308 on 8517  Progress: 7309 on 8517  Progress: 7310 on 8517  Progress: 7311 on 8517  Progress: 7312 on 8517  Progress: 7313 on 8517  Progress: 7314 on 8517  Progress: 7315 on 8517  Progress: 7316 on 8517  Progress: 7317 on 8517  Progress: 7318 on 8517  Progress: 7319 on 8517  Progress: 7320 on 8517  Progress: 7321 on 8517  Progress: 7322 on 8517  Progress: 7323 on 8517  Progress: 7324 on 8517  Progress: 7325 on 8517  Progress: 7326 on 8517  Progress: 7327 on 8517  Progress: 7328 on 8517  Progress: 7329 on 8517  Progress: 7330 on 8517  Progress: 7331 on 8517  Progress: 7332 on 8517  Progress: 7333 on 8517  Progress: 7334 on 8517  Progress: 7335 on 8517  Progress: 7336 on 8517  Progress: 7337 on 8517  Progress: 7338 on 8517  Progress: 7339 on 8517  Progress: 7340 on 8517  Progress: 7341 on 8517  Progress: 7342 on 8517  Progress: 7343 on 8517  Progress: 7344 on 8517  Progress: 7345 on 8517  Progress: 7346 on 8517  Progress: 7347 on 8517  Progress: 7348 on 8517  Progress: 7349 on 8517  Progress: 7350 on 8517  Progress: 7351 on 8517  Progress: 7352 on 8517  Progress: 7353 on 8517  Progress: 7354 on 8517  Progress: 7355 on 8517  Progress: 7356 on 8517  Progress: 7357 on 8517  Progress: 7358 on 8517  Progress: 7359 on 8517  Progress: 7360 on 8517  Progress: 7361 on 8517  Progress: 7362 on 8517  Progress: 7363 on 8517  Progress: 7364 on 8517  Progress: 7365 on 8517  Progress: 7366 on 8517  Progress: 7367 on 8517  Progress: 7368 on 8517  Progress: 7369 on 8517  Progress: 7370 on 8517  Progress: 7371 on 8517  Progress: 7372 on 8517  Progress: 7373 on 8517  Progress: 7374 on 8517  Progress: 7375 on 8517  Progress: 7376 on 8517  Progress: 7377 on 8517  Progress: 7378 on 8517  Progress: 7379 on 8517  Progress: 7380 on 8517  Progress: 7381 on 8517  Progress: 7382 on 8517  Progress: 7383 on 8517  Progress: 7384 on 8517  Progress: 7385 on 8517  Progress: 7386 on 8517  Progress: 7387 on 8517  Progress: 7388 on 8517  Progress: 7389 on 8517  Progress: 7390 on 8517  Progress: 7391 on 8517  Progress: 7392 on 8517  Progress: 7393 on 8517  Progress: 7394 on 8517  Progress: 7395 on 8517  Progress: 7396 on 8517  Progress: 7397 on 8517  Progress: 7398 on 8517  Progress: 7399 on 8517  Progress: 7400 on 8517  Progress: 7401 on 8517  Progress: 7402 on 8517  Progress: 7403 on 8517  Progress: 7404 on 8517  Progress: 7405 on 8517  Progress: 7406 on 8517  Progress: 7407 on 8517  Progress: 7408 on 8517  Progress: 7409 on 8517  Progress: 7410 on 8517  Progress: 7411 on 8517  Progress: 7412 on 8517  Progress: 7413 on 8517  Progress: 7414 on 8517  Progress: 7415 on 8517  Progress: 7416 on 8517  Progress: 7417 on 8517  Progress: 7418 on 8517  Progress: 7419 on 8517  Progress: 7420 on 8517  Progress: 7421 on 8517  Progress: 7422 on 8517  Progress: 7423 on 8517  Progress: 7424 on 8517  Progress: 7425 on 8517  Progress: 7426 on 8517  Progress: 7427 on 8517  Progress: 7428 on 8517  Progress: 7429 on 8517  Progress: 7430 on 8517  Progress: 7431 on 8517  Progress: 7432 on 8517  Progress: 7433 on 8517  Progress: 7434 on 8517  Progress: 7435 on 8517  Progress: 7436 on 8517  Progress: 7437 on 8517  Progress: 7438 on 8517  Progress: 7439 on 8517  Progress: 7440 on 8517  Progress: 7441 on 8517  Progress: 7442 on 8517  Progress: 7443 on 8517  Progress: 7444 on 8517  Progress: 7445 on 8517  Progress: 7446 on 8517  Progress: 7447 on 8517  Progress: 7448 on 8517  Progress: 7449 on 8517  Progress: 7450 on 8517  Progress: 7451 on 8517  Progress: 7452 on 8517  Progress: 7453 on 8517  Progress: 7454 on 8517  Progress: 7455 on 8517  Progress: 7456 on 8517  Progress: 7457 on 8517  Progress: 7458 on 8517  Progress: 7459 on 8517  Progress: 7460 on 8517  Progress: 7461 on 8517  Progress: 7462 on 8517  Progress: 7463 on 8517  Progress: 7464 on 8517  Progress: 7465 on 8517  Progress: 7466 on 8517  Progress: 7467 on 8517  Progress: 7468 on 8517  Progress: 7469 on 8517  Progress: 7470 on 8517  Progress: 7471 on 8517  Progress: 7472 on 8517  Progress: 7473 on 8517  Progress: 7474 on 8517  Progress: 7475 on 8517  Progress: 7476 on 8517  Progress: 7477 on 8517  Progress: 7478 on 8517  Progress: 7479 on 8517  Progress: 7480 on 8517  Progress: 7481 on 8517  Progress: 7482 on 8517  Progress: 7483 on 8517  Progress: 7484 on 8517  Progress: 7485 on 8517  Progress: 7486 on 8517  Progress: 7487 on 8517  Progress: 7488 on 8517  Progress: 7489 on 8517  Progress: 7490 on 8517  Progress: 7491 on 8517  Progress: 7492 on 8517  Progress: 7493 on 8517  Progress: 7494 on 8517  Progress: 7495 on 8517  Progress: 7496 on 8517  Progress: 7497 on 8517  Progress: 7498 on 8517  Progress: 7499 on 8517  Progress: 7500 on 8517  Progress: 7501 on 8517  Progress: 7502 on 8517  Progress: 7503 on 8517  Progress: 7504 on 8517  Progress: 7505 on 8517  Progress: 7506 on 8517  Progress: 7507 on 8517  Progress: 7508 on 8517  Progress: 7509 on 8517  Progress: 7510 on 8517  Progress: 7511 on 8517  Progress: 7512 on 8517  Progress: 7513 on 8517  Progress: 7514 on 8517  Progress: 7515 on 8517  Progress: 7516 on 8517  Progress: 7517 on 8517  Progress: 7518 on 8517  Progress: 7519 on 8517  Progress: 7520 on 8517  Progress: 7521 on 8517  Progress: 7522 on 8517  Progress: 7523 on 8517  Progress: 7524 on 8517  Progress: 7525 on 8517  Progress: 7526 on 8517  Progress: 7527 on 8517  Progress: 7528 on 8517  Progress: 7529 on 8517  Progress: 7530 on 8517  Progress: 7531 on 8517  Progress: 7532 on 8517  Progress: 7533 on 8517  Progress: 7534 on 8517  Progress: 7535 on 8517  Progress: 7536 on 8517  Progress: 7537 on 8517  Progress: 7538 on 8517  Progress: 7539 on 8517  Progress: 7540 on 8517  Progress: 7541 on 8517  Progress: 7542 on 8517  Progress: 7543 on 8517  Progress: 7544 on 8517  Progress: 7545 on 8517  Progress: 7546 on 8517  Progress: 7547 on 8517  Progress: 7548 on 8517  Progress: 7549 on 8517  Progress: 7550 on 8517  Progress: 7551 on 8517  Progress: 7552 on 8517  Progress: 7553 on 8517  Progress: 7554 on 8517  Progress: 7555 on 8517  Progress: 7556 on 8517  Progress: 7557 on 8517  Progress: 7558 on 8517  Progress: 7559 on 8517  Progress: 7560 on 8517  Progress: 7561 on 8517  Progress: 7562 on 8517  Progress: 7563 on 8517  Progress: 7564 on 8517  Progress: 7565 on 8517  Progress: 7566 on 8517  Progress: 7567 on 8517  Progress: 7568 on 8517  Progress: 7569 on 8517  Progress: 7570 on 8517  Progress: 7571 on 8517  Progress: 7572 on 8517  Progress: 7573 on 8517  Progress: 7574 on 8517  Progress: 7575 on 8517  Progress: 7576 on 8517  Progress: 7577 on 8517  Progress: 7578 on 8517  Progress: 7579 on 8517  Progress: 7580 on 8517  Progress: 7581 on 8517  Progress: 7582 on 8517  Progress: 7583 on 8517  Progress: 7584 on 8517  Progress: 7585 on 8517  Progress: 7586 on 8517  Progress: 7587 on 8517  Progress: 7588 on 8517  Progress: 7589 on 8517  Progress: 7590 on 8517  Progress: 7591 on 8517  Progress: 7592 on 8517  Progress: 7593 on 8517  Progress: 7594 on 8517  Progress: 7595 on 8517  Progress: 7596 on 8517  Progress: 7597 on 8517  Progress: 7598 on 8517  Progress: 7599 on 8517  Progress: 7600 on 8517  Progress: 7601 on 8517  Progress: 7602 on 8517  Progress: 7603 on 8517  Progress: 7604 on 8517  Progress: 7605 on 8517  Progress: 7606 on 8517  Progress: 7607 on 8517  Progress: 7608 on 8517  Progress: 7609 on 8517  Progress: 7610 on 8517  Progress: 7611 on 8517  Progress: 7612 on 8517  Progress: 7613 on 8517  Progress: 7614 on 8517  Progress: 7615 on 8517  Progress: 7616 on 8517  Progress: 7617 on 8517  Progress: 7618 on 8517  Progress: 7619 on 8517  Progress: 7620 on 8517  Progress: 7621 on 8517  Progress: 7622 on 8517  Progress: 7623 on 8517  Progress: 7624 on 8517  Progress: 7625 on 8517  Progress: 7626 on 8517  Progress: 7627 on 8517  Progress: 7628 on 8517  Progress: 7629 on 8517  Progress: 7630 on 8517  Progress: 7631 on 8517  Progress: 7632 on 8517  Progress: 7633 on 8517  Progress: 7634 on 8517  Progress: 7635 on 8517  Progress: 7636 on 8517  Progress: 7637 on 8517  Progress: 7638 on 8517  Progress: 7639 on 8517  Progress: 7640 on 8517  Progress: 7641 on 8517  Progress: 7642 on 8517  Progress: 7643 on 8517  Progress: 7644 on 8517  Progress: 7645 on 8517  Progress: 7646 on 8517  Progress: 7647 on 8517  Progress: 7648 on 8517  Progress: 7649 on 8517  Progress: 7650 on 8517  Progress: 7651 on 8517  Progress: 7652 on 8517  Progress: 7653 on 8517  Progress: 7654 on 8517  Progress: 7655 on 8517  Progress: 7656 on 8517  Progress: 7657 on 8517  Progress: 7658 on 8517  Progress: 7659 on 8517  Progress: 7660 on 8517  Progress: 7661 on 8517  Progress: 7662 on 8517  Progress: 7663 on 8517  Progress: 7664 on 8517  Progress: 7665 on 8517  Progress: 7666 on 8517  Progress: 7667 on 8517  Progress: 7668 on 8517  Progress: 7669 on 8517  Progress: 7670 on 8517  Progress: 7671 on 8517  Progress: 7672 on 8517  Progress: 7673 on 8517  Progress: 7674 on 8517  Progress: 7675 on 8517  Progress: 7676 on 8517  Progress: 7677 on 8517  Progress: 7678 on 8517  Progress: 7679 on 8517  Progress: 7680 on 8517  Progress: 7681 on 8517  Progress: 7682 on 8517  Progress: 7683 on 8517  Progress: 7684 on 8517  Progress: 7685 on 8517  Progress: 7686 on 8517  Progress: 7687 on 8517  Progress: 7688 on 8517  Progress: 7689 on 8517  Progress: 7690 on 8517  Progress: 7691 on 8517  Progress: 7692 on 8517  Progress: 7693 on 8517  Progress: 7694 on 8517  Progress: 7695 on 8517  Progress: 7696 on 8517  Progress: 7697 on 8517  Progress: 7698 on 8517  Progress: 7699 on 8517  Progress: 7700 on 8517  Progress: 7701 on 8517  Progress: 7702 on 8517  Progress: 7703 on 8517  Progress: 7704 on 8517  Progress: 7705 on 8517  Progress: 7706 on 8517  Progress: 7707 on 8517  Progress: 7708 on 8517  Progress: 7709 on 8517  Progress: 7710 on 8517  Progress: 7711 on 8517  Progress: 7712 on 8517  Progress: 7713 on 8517  Progress: 7714 on 8517  Progress: 7715 on 8517  Progress: 7716 on 8517  Progress: 7717 on 8517  Progress: 7718 on 8517  Progress: 7719 on 8517  Progress: 7720 on 8517  Progress: 7721 on 8517  Progress: 7722 on 8517  Progress: 7723 on 8517  Progress: 7724 on 8517  Progress: 7725 on 8517  Progress: 7726 on 8517  Progress: 7727 on 8517  Progress: 7728 on 8517  Progress: 7729 on 8517  Progress: 7730 on 8517  Progress: 7731 on 8517  Progress: 7732 on 8517  Progress: 7733 on 8517  Progress: 7734 on 8517  Progress: 7735 on 8517  Progress: 7736 on 8517  Progress: 7737 on 8517  Progress: 7738 on 8517  Progress: 7739 on 8517  Progress: 7740 on 8517  Progress: 7741 on 8517  Progress: 7742 on 8517  Progress: 7743 on 8517  Progress: 7744 on 8517  Progress: 7745 on 8517  Progress: 7746 on 8517  Progress: 7747 on 8517  Progress: 7748 on 8517  Progress: 7749 on 8517  Progress: 7750 on 8517  Progress: 7751 on 8517  Progress: 7752 on 8517  Progress: 7753 on 8517  Progress: 7754 on 8517  Progress: 7755 on 8517  Progress: 7756 on 8517  Progress: 7757 on 8517  Progress: 7758 on 8517  Progress: 7759 on 8517  Progress: 7760 on 8517  Progress: 7761 on 8517  Progress: 7762 on 8517  Progress: 7763 on 8517  Progress: 7764 on 8517  Progress: 7765 on 8517  Progress: 7766 on 8517  Progress: 7767 on 8517  Progress: 7768 on 8517  Progress: 7769 on 8517  Progress: 7770 on 8517  Progress: 7771 on 8517  Progress: 7772 on 8517  Progress: 7773 on 8517  Progress: 7774 on 8517  Progress: 7775 on 8517  Progress: 7776 on 8517  Progress: 7777 on 8517  Progress: 7778 on 8517  Progress: 7779 on 8517  Progress: 7780 on 8517  Progress: 7781 on 8517  Progress: 7782 on 8517  Progress: 7783 on 8517  Progress: 7784 on 8517  Progress: 7785 on 8517  Progress: 7786 on 8517  Progress: 7787 on 8517  Progress: 7788 on 8517  Progress: 7789 on 8517  Progress: 7790 on 8517  Progress: 7791 on 8517  Progress: 7792 on 8517  Progress: 7793 on 8517  Progress: 7794 on 8517  Progress: 7795 on 8517  Progress: 7796 on 8517  Progress: 7797 on 8517  Progress: 7798 on 8517  Progress: 7799 on 8517  Progress: 7800 on 8517  Progress: 7801 on 8517  Progress: 7802 on 8517  Progress: 7803 on 8517  Progress: 7804 on 8517  Progress: 7805 on 8517  Progress: 7806 on 8517  Progress: 7807 on 8517  Progress: 7808 on 8517  Progress: 7809 on 8517  Progress: 7810 on 8517  Progress: 7811 on 8517  Progress: 7812 on 8517  Progress: 7813 on 8517  Progress: 7814 on 8517  Progress: 7815 on 8517  Progress: 7816 on 8517  Progress: 7817 on 8517  Progress: 7818 on 8517  Progress: 7819 on 8517  Progress: 7820 on 8517  Progress: 7821 on 8517  Progress: 7822 on 8517  Progress: 7823 on 8517  Progress: 7824 on 8517  Progress: 7825 on 8517  Progress: 7826 on 8517  Progress: 7827 on 8517  Progress: 7828 on 8517  Progress: 7829 on 8517  Progress: 7830 on 8517  Progress: 7831 on 8517  Progress: 7832 on 8517  Progress: 7833 on 8517  Progress: 7834 on 8517  Progress: 7835 on 8517  Progress: 7836 on 8517  Progress: 7837 on 8517  Progress: 7838 on 8517  Progress: 7839 on 8517  Progress: 7840 on 8517  Progress: 7841 on 8517  Progress: 7842 on 8517  Progress: 7843 on 8517  Progress: 7844 on 8517  Progress: 7845 on 8517  Progress: 7846 on 8517  Progress: 7847 on 8517  Progress: 7848 on 8517  Progress: 7849 on 8517  Progress: 7850 on 8517  Progress: 7851 on 8517  Progress: 7852 on 8517  Progress: 7853 on 8517  Progress: 7854 on 8517  Progress: 7855 on 8517  Progress: 7856 on 8517  Progress: 7857 on 8517  Progress: 7858 on 8517  Progress: 7859 on 8517  Progress: 7860 on 8517  Progress: 7861 on 8517  Progress: 7862 on 8517  Progress: 7863 on 8517  Progress: 7864 on 8517  Progress: 7865 on 8517  Progress: 7866 on 8517  Progress: 7867 on 8517  Progress: 7868 on 8517  Progress: 7869 on 8517  Progress: 7870 on 8517  Progress: 7871 on 8517  Progress: 7872 on 8517  Progress: 7873 on 8517  Progress: 7874 on 8517  Progress: 7875 on 8517  Progress: 7876 on 8517  Progress: 7877 on 8517  Progress: 7878 on 8517  Progress: 7879 on 8517  Progress: 7880 on 8517  Progress: 7881 on 8517  Progress: 7882 on 8517  Progress: 7883 on 8517  Progress: 7884 on 8517  Progress: 7885 on 8517  Progress: 7886 on 8517  Progress: 7887 on 8517  Progress: 7888 on 8517  Progress: 7889 on 8517  Progress: 7890 on 8517  Progress: 7891 on 8517  Progress: 7892 on 8517  Progress: 7893 on 8517  Progress: 7894 on 8517  Progress: 7895 on 8517  Progress: 7896 on 8517  Progress: 7897 on 8517  Progress: 7898 on 8517  Progress: 7899 on 8517  Progress: 7900 on 8517  Progress: 7901 on 8517  Progress: 7902 on 8517  Progress: 7903 on 8517  Progress: 7904 on 8517  Progress: 7905 on 8517  Progress: 7906 on 8517  Progress: 7907 on 8517  Progress: 7908 on 8517  Progress: 7909 on 8517  Progress: 7910 on 8517  Progress: 7911 on 8517  Progress: 7912 on 8517  Progress: 7913 on 8517  Progress: 7914 on 8517  Progress: 7915 on 8517  Progress: 7916 on 8517  Progress: 7917 on 8517  Progress: 7918 on 8517  Progress: 7919 on 8517  Progress: 7920 on 8517  Progress: 7921 on 8517  Progress: 7922 on 8517  Progress: 7923 on 8517  Progress: 7924 on 8517  Progress: 7925 on 8517  Progress: 7926 on 8517  Progress: 7927 on 8517  Progress: 7928 on 8517  Progress: 7929 on 8517  Progress: 7930 on 8517  Progress: 7931 on 8517  Progress: 7932 on 8517  Progress: 7933 on 8517  Progress: 7934 on 8517  Progress: 7935 on 8517  Progress: 7936 on 8517  Progress: 7937 on 8517  Progress: 7938 on 8517  Progress: 7939 on 8517  Progress: 7940 on 8517  Progress: 7941 on 8517  Progress: 7942 on 8517  Progress: 7943 on 8517  Progress: 7944 on 8517  Progress: 7945 on 8517  Progress: 7946 on 8517  Progress: 7947 on 8517  Progress: 7948 on 8517  Progress: 7949 on 8517  Progress: 7950 on 8517  Progress: 7951 on 8517  Progress: 7952 on 8517  Progress: 7953 on 8517  Progress: 7954 on 8517  Progress: 7955 on 8517  Progress: 7956 on 8517  Progress: 7957 on 8517  Progress: 7958 on 8517  Progress: 7959 on 8517  Progress: 7960 on 8517  Progress: 7961 on 8517  Progress: 7962 on 8517  Progress: 7963 on 8517  Progress: 7964 on 8517  Progress: 7965 on 8517  Progress: 7966 on 8517  Progress: 7967 on 8517  Progress: 7968 on 8517  Progress: 7969 on 8517  Progress: 7970 on 8517  Progress: 7971 on 8517  Progress: 7972 on 8517  Progress: 7973 on 8517  Progress: 7974 on 8517  Progress: 7975 on 8517  Progress: 7976 on 8517  Progress: 7977 on 8517  Progress: 7978 on 8517  Progress: 7979 on 8517  Progress: 7980 on 8517  Progress: 7981 on 8517  Progress: 7982 on 8517  Progress: 7983 on 8517  Progress: 7984 on 8517  Progress: 7985 on 8517  Progress: 7986 on 8517  Progress: 7987 on 8517  Progress: 7988 on 8517  Progress: 7989 on 8517  Progress: 7990 on 8517  Progress: 7991 on 8517  Progress: 7992 on 8517  Progress: 7993 on 8517  Progress: 7994 on 8517  Progress: 7995 on 8517  Progress: 7996 on 8517  Progress: 7997 on 8517  Progress: 7998 on 8517  Progress: 7999 on 8517  Progress: 8000 on 8517  Progress: 8001 on 8517  Progress: 8002 on 8517  Progress: 8003 on 8517  Progress: 8004 on 8517  Progress: 8005 on 8517  Progress: 8006 on 8517  Progress: 8007 on 8517  Progress: 8008 on 8517  Progress: 8009 on 8517  Progress: 8010 on 8517  Progress: 8011 on 8517  Progress: 8012 on 8517  Progress: 8013 on 8517  Progress: 8014 on 8517  Progress: 8015 on 8517  Progress: 8016 on 8517  Progress: 8017 on 8517  Progress: 8018 on 8517  Progress: 8019 on 8517  Progress: 8020 on 8517  Progress: 8021 on 8517  Progress: 8022 on 8517  Progress: 8023 on 8517  Progress: 8024 on 8517  Progress: 8025 on 8517  Progress: 8026 on 8517  Progress: 8027 on 8517  Progress: 8028 on 8517  Progress: 8029 on 8517  Progress: 8030 on 8517  Progress: 8031 on 8517  Progress: 8032 on 8517  Progress: 8033 on 8517  Progress: 8034 on 8517  Progress: 8035 on 8517  Progress: 8036 on 8517  Progress: 8037 on 8517  Progress: 8038 on 8517  Progress: 8039 on 8517  Progress: 8040 on 8517  Progress: 8041 on 8517  Progress: 8042 on 8517  Progress: 8043 on 8517  Progress: 8044 on 8517  Progress: 8045 on 8517  Progress: 8046 on 8517  Progress: 8047 on 8517  Progress: 8048 on 8517  Progress: 8049 on 8517  Progress: 8050 on 8517  Progress: 8051 on 8517  Progress: 8052 on 8517  Progress: 8053 on 8517  Progress: 8054 on 8517  Progress: 8055 on 8517  Progress: 8056 on 8517  Progress: 8057 on 8517  Progress: 8058 on 8517  Progress: 8059 on 8517  Progress: 8060 on 8517  Progress: 8061 on 8517  Progress: 8062 on 8517  Progress: 8063 on 8517  Progress: 8064 on 8517  Progress: 8065 on 8517  Progress: 8066 on 8517  Progress: 8067 on 8517  Progress: 8068 on 8517  Progress: 8069 on 8517  Progress: 8070 on 8517  Progress: 8071 on 8517  Progress: 8072 on 8517  Progress: 8073 on 8517  Progress: 8074 on 8517  Progress: 8075 on 8517  Progress: 8076 on 8517  Progress: 8077 on 8517  Progress: 8078 on 8517  Progress: 8079 on 8517  Progress: 8080 on 8517  Progress: 8081 on 8517  Progress: 8082 on 8517  Progress: 8083 on 8517  Progress: 8084 on 8517  Progress: 8085 on 8517  Progress: 8086 on 8517  Progress: 8087 on 8517  Progress: 8088 on 8517  Progress: 8089 on 8517  Progress: 8090 on 8517  Progress: 8091 on 8517  Progress: 8092 on 8517  Progress: 8093 on 8517  Progress: 8094 on 8517  Progress: 8095 on 8517  Progress: 8096 on 8517  Progress: 8097 on 8517  Progress: 8098 on 8517  Progress: 8099 on 8517  Progress: 8100 on 8517  Progress: 8101 on 8517  Progress: 8102 on 8517  Progress: 8103 on 8517  Progress: 8104 on 8517  Progress: 8105 on 8517  Progress: 8106 on 8517  Progress: 8107 on 8517  Progress: 8108 on 8517  Progress: 8109 on 8517  Progress: 8110 on 8517  Progress: 8111 on 8517  Progress: 8112 on 8517  Progress: 8113 on 8517  Progress: 8114 on 8517  Progress: 8115 on 8517  Progress: 8116 on 8517  Progress: 8117 on 8517  Progress: 8118 on 8517  Progress: 8119 on 8517  Progress: 8120 on 8517  Progress: 8121 on 8517  Progress: 8122 on 8517  Progress: 8123 on 8517  Progress: 8124 on 8517  Progress: 8125 on 8517  Progress: 8126 on 8517  Progress: 8127 on 8517  Progress: 8128 on 8517  Progress: 8129 on 8517  Progress: 8130 on 8517  Progress: 8131 on 8517  Progress: 8132 on 8517  Progress: 8133 on 8517  Progress: 8134 on 8517  Progress: 8135 on 8517  Progress: 8136 on 8517  Progress: 8137 on 8517  Progress: 8138 on 8517  Progress: 8139 on 8517  Progress: 8140 on 8517  Progress: 8141 on 8517  Progress: 8142 on 8517  Progress: 8143 on 8517  Progress: 8144 on 8517  Progress: 8145 on 8517  Progress: 8146 on 8517  Progress: 8147 on 8517  Progress: 8148 on 8517  Progress: 8149 on 8517  Progress: 8150 on 8517  Progress: 8151 on 8517  Progress: 8152 on 8517  Progress: 8153 on 8517  Progress: 8154 on 8517  Progress: 8155 on 8517  Progress: 8156 on 8517  Progress: 8157 on 8517  Progress: 8158 on 8517  Progress: 8159 on 8517  Progress: 8160 on 8517  Progress: 8161 on 8517  Progress: 8162 on 8517  Progress: 8163 on 8517  Progress: 8164 on 8517  Progress: 8165 on 8517  Progress: 8166 on 8517  Progress: 8167 on 8517  Progress: 8168 on 8517  Progress: 8169 on 8517  Progress: 8170 on 8517  Progress: 8171 on 8517  Progress: 8172 on 8517  Progress: 8173 on 8517  Progress: 8174 on 8517  Progress: 8175 on 8517  Progress: 8176 on 8517  Progress: 8177 on 8517  Progress: 8178 on 8517  Progress: 8179 on 8517  Progress: 8180 on 8517  Progress: 8181 on 8517  Progress: 8182 on 8517  Progress: 8183 on 8517  Progress: 8184 on 8517  Progress: 8185 on 8517  Progress: 8186 on 8517  Progress: 8187 on 8517  Progress: 8188 on 8517  Progress: 8189 on 8517  Progress: 8190 on 8517  Progress: 8191 on 8517  Progress: 8192 on 8517  Progress: 8193 on 8517  Progress: 8194 on 8517  Progress: 8195 on 8517  Progress: 8196 on 8517  Progress: 8197 on 8517  Progress: 8198 on 8517  Progress: 8199 on 8517  Progress: 8200 on 8517  Progress: 8201 on 8517  Progress: 8202 on 8517  Progress: 8203 on 8517  Progress: 8204 on 8517  Progress: 8205 on 8517  Progress: 8206 on 8517  Progress: 8207 on 8517  Progress: 8208 on 8517  Progress: 8209 on 8517  Progress: 8210 on 8517  Progress: 8211 on 8517  Progress: 8212 on 8517  Progress: 8213 on 8517  Progress: 8214 on 8517  Progress: 8215 on 8517  Progress: 8216 on 8517  Progress: 8217 on 8517  Progress: 8218 on 8517  Progress: 8219 on 8517  Progress: 8220 on 8517  Progress: 8221 on 8517  Progress: 8222 on 8517  Progress: 8223 on 8517  Progress: 8224 on 8517  Progress: 8225 on 8517  Progress: 8226 on 8517  Progress: 8227 on 8517  Progress: 8228 on 8517  Progress: 8229 on 8517  Progress: 8230 on 8517  Progress: 8231 on 8517  Progress: 8232 on 8517  Progress: 8233 on 8517  Progress: 8234 on 8517  Progress: 8235 on 8517  Progress: 8236 on 8517  Progress: 8237 on 8517  Progress: 8238 on 8517  Progress: 8239 on 8517  Progress: 8240 on 8517  Progress: 8241 on 8517  Progress: 8242 on 8517  Progress: 8243 on 8517  Progress: 8244 on 8517  Progress: 8245 on 8517  Progress: 8246 on 8517  Progress: 8247 on 8517  Progress: 8248 on 8517  Progress: 8249 on 8517  Progress: 8250 on 8517  Progress: 8251 on 8517  Progress: 8252 on 8517  Progress: 8253 on 8517  Progress: 8254 on 8517  Progress: 8255 on 8517  Progress: 8256 on 8517  Progress: 8257 on 8517  Progress: 8258 on 8517  Progress: 8259 on 8517  Progress: 8260 on 8517  Progress: 8261 on 8517  Progress: 8262 on 8517  Progress: 8263 on 8517  Progress: 8264 on 8517  Progress: 8265 on 8517  Progress: 8266 on 8517  Progress: 8267 on 8517  Progress: 8268 on 8517  Progress: 8269 on 8517  Progress: 8270 on 8517  Progress: 8271 on 8517  Progress: 8272 on 8517  Progress: 8273 on 8517  Progress: 8274 on 8517  Progress: 8275 on 8517  Progress: 8276 on 8517  Progress: 8277 on 8517  Progress: 8278 on 8517  Progress: 8279 on 8517  Progress: 8280 on 8517  Progress: 8281 on 8517  Progress: 8282 on 8517  Progress: 8283 on 8517  Progress: 8284 on 8517  Progress: 8285 on 8517  Progress: 8286 on 8517  Progress: 8287 on 8517  Progress: 8288 on 8517  Progress: 8289 on 8517  Progress: 8290 on 8517  Progress: 8291 on 8517  Progress: 8292 on 8517  Progress: 8293 on 8517  Progress: 8294 on 8517  Progress: 8295 on 8517  Progress: 8296 on 8517  Progress: 8297 on 8517  Progress: 8298 on 8517  Progress: 8299 on 8517  Progress: 8300 on 8517  Progress: 8301 on 8517  Progress: 8302 on 8517  Progress: 8303 on 8517  Progress: 8304 on 8517  Progress: 8305 on 8517  Progress: 8306 on 8517  Progress: 8307 on 8517  Progress: 8308 on 8517  Progress: 8309 on 8517  Progress: 8310 on 8517  Progress: 8311 on 8517  Progress: 8312 on 8517  Progress: 8313 on 8517  Progress: 8314 on 8517  Progress: 8315 on 8517  Progress: 8316 on 8517  Progress: 8317 on 8517  Progress: 8318 on 8517  Progress: 8319 on 8517  Progress: 8320 on 8517  Progress: 8321 on 8517  Progress: 8322 on 8517  Progress: 8323 on 8517  Progress: 8324 on 8517  Progress: 8325 on 8517  Progress: 8326 on 8517  Progress: 8327 on 8517  Progress: 8328 on 8517  Progress: 8329 on 8517  Progress: 8330 on 8517  Progress: 8331 on 8517  Progress: 8332 on 8517  Progress: 8333 on 8517  Progress: 8334 on 8517  Progress: 8335 on 8517  Progress: 8336 on 8517  Progress: 8337 on 8517  Progress: 8338 on 8517  Progress: 8339 on 8517  Progress: 8340 on 8517  Progress: 8341 on 8517  Progress: 8342 on 8517  Progress: 8343 on 8517  Progress: 8344 on 8517  Progress: 8345 on 8517  Progress: 8346 on 8517  Progress: 8347 on 8517  Progress: 8348 on 8517  Progress: 8349 on 8517  Progress: 8350 on 8517  Progress: 8351 on 8517  Progress: 8352 on 8517  Progress: 8353 on 8517  Progress: 8354 on 8517  Progress: 8355 on 8517  Progress: 8356 on 8517  Progress: 8357 on 8517  Progress: 8358 on 8517  Progress: 8359 on 8517  Progress: 8360 on 8517  Progress: 8361 on 8517  Progress: 8362 on 8517  Progress: 8363 on 8517  Progress: 8364 on 8517  Progress: 8365 on 8517  Progress: 8366 on 8517  Progress: 8367 on 8517  Progress: 8368 on 8517  Progress: 8369 on 8517  Progress: 8370 on 8517  Progress: 8371 on 8517  Progress: 8372 on 8517  Progress: 8373 on 8517  Progress: 8374 on 8517  Progress: 8375 on 8517  Progress: 8376 on 8517  Progress: 8377 on 8517  Progress: 8378 on 8517  Progress: 8379 on 8517  Progress: 8380 on 8517  Progress: 8381 on 8517  Progress: 8382 on 8517  Progress: 8383 on 8517  Progress: 8384 on 8517  Progress: 8385 on 8517  Progress: 8386 on 8517  Progress: 8387 on 8517  Progress: 8388 on 8517  Progress: 8389 on 8517  Progress: 8390 on 8517  Progress: 8391 on 8517  Progress: 8392 on 8517  Progress: 8393 on 8517  Progress: 8394 on 8517  Progress: 8395 on 8517  Progress: 8396 on 8517  Progress: 8397 on 8517  Progress: 8398 on 8517  Progress: 8399 on 8517  Progress: 8400 on 8517  Progress: 8401 on 8517  Progress: 8402 on 8517  Progress: 8403 on 8517  Progress: 8404 on 8517  Progress: 8405 on 8517  Progress: 8406 on 8517  Progress: 8407 on 8517  Progress: 8408 on 8517  Progress: 8409 on 8517  Progress: 8410 on 8517  Progress: 8411 on 8517  Progress: 8412 on 8517  Progress: 8413 on 8517  Progress: 8414 on 8517  Progress: 8415 on 8517  Progress: 8416 on 8517  Progress: 8417 on 8517  Progress: 8418 on 8517  Progress: 8419 on 8517  Progress: 8420 on 8517  Progress: 8421 on 8517  Progress: 8422 on 8517  Progress: 8423 on 8517  Progress: 8424 on 8517  Progress: 8425 on 8517  Progress: 8426 on 8517  Progress: 8427 on 8517  Progress: 8428 on 8517  Progress: 8429 on 8517  Progress: 8430 on 8517  Progress: 8431 on 8517  Progress: 8432 on 8517  Progress: 8433 on 8517  Progress: 8434 on 8517  Progress: 8435 on 8517  Progress: 8436 on 8517  Progress: 8437 on 8517  Progress: 8438 on 8517  Progress: 8439 on 8517  Progress: 8440 on 8517  Progress: 8441 on 8517  Progress: 8442 on 8517  Progress: 8443 on 8517  Progress: 8444 on 8517  Progress: 8445 on 8517  Progress: 8446 on 8517  Progress: 8447 on 8517  Progress: 8448 on 8517  Progress: 8449 on 8517  Progress: 8450 on 8517  Progress: 8451 on 8517  Progress: 8452 on 8517  Progress: 8453 on 8517  Progress: 8454 on 8517  Progress: 8455 on 8517  Progress: 8456 on 8517  Progress: 8457 on 8517  Progress: 8458 on 8517  Progress: 8459 on 8517  Progress: 8460 on 8517  Progress: 8461 on 8517  Progress: 8462 on 8517  Progress: 8463 on 8517  Progress: 8464 on 8517  Progress: 8465 on 8517  Progress: 8466 on 8517  Progress: 8467 on 8517  Progress: 8468 on 8517  Progress: 8469 on 8517  Progress: 8470 on 8517  Progress: 8471 on 8517  Progress: 8472 on 8517  Progress: 8473 on 8517  Progress: 8474 on 8517  Progress: 8475 on 8517  Progress: 8476 on 8517  Progress: 8477 on 8517  Progress: 8478 on 8517  Progress: 8479 on 8517  Progress: 8480 on 8517  Progress: 8481 on 8517  Progress: 8482 on 8517  Progress: 8483 on 8517  Progress: 8484 on 8517  Progress: 8485 on 8517  Progress: 8486 on 8517  Progress: 8487 on 8517  Progress: 8488 on 8517  Progress: 8489 on 8517  Progress: 8490 on 8517  Progress: 8491 on 8517  Progress: 8492 on 8517  Progress: 8493 on 8517  Progress: 8494 on 8517  Progress: 8495 on 8517  Progress: 8496 on 8517  Progress: 8497 on 8517  Progress: 8498 on 8517  Progress: 8499 on 8517  Progress: 8500 on 8517  Progress: 8501 on 8517  Progress: 8502 on 8517  Progress: 8503 on 8517  Progress: 8504 on 8517  Progress: 8505 on 8517  Progress: 8506 on 8517  Progress: 8507 on 8517  Progress: 8508 on 8517  Progress: 8509 on 8517  Progress: 8510 on 8517  Progress: 8511 on 8517  Progress: 8512 on 8517  Progress: 8513 on 8517  Progress: 8514 on 8517  Progress: 8515 on 8517  Progress: 8516 on 8517  Progress: 8517 on 8517  
za_instytucja <- za_instytucja %>%
  filter(is.na(czy_nazwisko)&is.na(czy_imie)) %>%
  filter(instytucja!="") %>%
  filter(!grepl("^\\[[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]|^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]",instytucja)) %>%
  mutate(instytucja = str_remove(instytucja,"\\.$")) %>%
  select(ZA_UWAGI,instytucja) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#10: wydawnictwo
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI, X260) %>%
  mutate(X260 = str_replace_all(X260,"s\\.n\\.", "b.w."), 
         X260 = str_replace_all(X260,"s\\.l\\.", "b.m."), 
         X260 = str_replace_all(X260,"S\\.l\\.", "b.m."), 
         X260 = str_remove(X260,"^\\\\+"), 
         rok_wydania = str_extract_all(X260, "(?<=\\$c).*(?=\\$e)|(?<=\\$c).*"), 
         bez_roku = str_replace_all(X260, ".\\$c.*", ""), 
         ile_wydawnictw = str_count(bez_roku, "\\$b"),
         ile_miejsc = str_count(bez_roku, "\\$a"),
         kolejnosc = str_replace_all(as.character(str_extract_all(bez_roku, "\\$.")), "[^a-z]", ""),
         bez_roku = str_replace_all(bez_roku, ";\\$b", ":$b"),
         wydaw_podziel = ifelse(ile_wydawnictw>ile_miejsc|kolejnosc=="caabb", str_replace_all(bez_roku, "(\\$a)(.*?)( :\\$b.*?)( :\\$b)", "\\1\\2\\3 ;$a\\2\\4"),bez_roku),
         wydawnictwo_test = str_replace_all(wydaw_podziel, "(\\$b)(.*?)( ;\\$a)", "\\1\\2|\\3")) %>%
  select(ZA_UWAGI,rok_wydania,wydawnictwo_test) %>%
  cSplit(., "wydawnictwo_test", sep = "|", direction = "long") %>%
  mutate(wydawnictwo = str_extract_all(wydawnictwo_test, "(?<=\\$b)(.*)"),
         miejsce_wydania = str_replace_all(str_extract_all(wydawnictwo_test, "(?<=\\$a)(.*)(?= {0,1}: {0,1}\\$b)|(?<=\\$a)(.*)($)")," ;\\$a", ", "),
         nazwa_prosta = str_to_lower(str_replace_all(str_replace_all(unlist(wydawnictwo_test), "\\$\\w", ""), "\\W", ""))) %>%
  left_join(.,PBL_wydawnictwa,by="nazwa_prosta") %>%
  mutate(to_samo = wydawnictwo==WY_NAZWA) %>%
  arrange(ZA_UWAGI,-to_samo,-WY_LICZBA_ZAPISOW)
BN_wydawnictwo$id_grupy <- cumsum(!duplicated(BN_wydawnictwo[1:3]))
BN_wydawnictwo <- BN_wydawnictwo[!duplicated(BN_wydawnictwo$id_grupy),] %>%
  mutate(WY_NAZWA = ifelse(!is.na(WY_NAZWA),as.character(WY_NAZWA),as.character(wydawnictwo)),
         WY_MIASTO = ifelse(!is.na(WY_MIASTO),as.character(WY_MIASTO),as.character(miejsce_wydania)),
         rok_wydania = str_replace_all(rok_wydania, "(.*)(\\.)", "\\1"),
         za_rok_wydania = ifelse(nchar(rok_wydania)==4,as.character(rok_wydania),NA),
         do_opisu = ifelse(is.na(za_rok_wydania),paste("[",str_extract(rok_wydania,"\\d{4}"),"]",sep = ""),""),
         WY_MIASTO = ifelse(substr(WY_MIASTO,1,1)=="["&substr(WY_MIASTO,nchar(WY_MIASTO),nchar(WY_MIASTO))!="]"&is.na(WY_WYDAWNICTWO_ID),paste(trim(WY_MIASTO),"]",sep = ""),as.character(WY_MIASTO))) %>%
  select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania,do_opisu)
argument is not an atomic vector; coercing
#11: opis fizyczny książki
#pole 300 do opisu fizycznego
marc_field_300 <- data %>%
  select(ZA_UWAGI,X300)%>%
  filter(X300!="") %>%
  mutate(X300=str_replace_all(X300,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X300",sep = "~",direction = "long") %>%
  filter(X300!="") %>%
  mutate(X300=str_remove_all(X300,"^\\|")) %>%
  mutate(indicator = str_replace_all(X300,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X300,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_300)[1]))
colnames(empty_table) <-subfield_list
marc_field_300<-cbind(marc_field_300,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_300$X300 <- str_replace(marc_field_300$X300,subfield_list_char[i],"|\\1")
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_300[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_300$X300),str_replace_all(gsub(string,"\\3",marc_field_300$X300),"\\${2}.", "~"),NA)
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
marc_field_300 <- marc_field_300 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$b` = str_remove(`$b`," \\;+$| \\:+$"),
         `$e` = ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`)&grepl("\\+ dysk|płyt",`$e`),str_extract(`$e`,"(?<=\\+)(dysk|płyt.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),
                       ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`),str_extract(`$e`,"(^.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),NA)),
         `$a` = ifelse(is.na(`$a`),"",as.character(`$a`)),
         `$b` = ifelse(is.na(`$b`),"",as.character(`$b`)),
         `$e` = ifelse(is.na(`$e`),"",as.character(`$e`)))
#pole 500 do opisu fizycznego
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  mutate(`$a` = ifelse(grepl("oryg(\\.|\\,)",X500)&grepl("pseud|nazwa",X500,ignore.case = TRUE),str_replace(`$a`,"(^.*?)(\\. )(\\p{Lu}.*$)","\\3"),as.character(`$a`))) %>% 
  filter(!grepl("oryg(\\.|\\,)",`$a`)&grepl("pseud|nazwa|dotycz|pol",`$a`,ignore.case = TRUE)) %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))
  
#pole 546 do opisu fizycznego
marc_field_546 <- data %>%
  select(ZA_UWAGI,X546)%>%
  filter(X546!="") %>%
  mutate(X546=str_replace_all(X546,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X546",sep = "~",direction = "long") %>%
  filter(X546!="") %>%
  mutate(X546=str_remove_all(X546,"^\\|")) %>%
  mutate(indicator = str_replace_all(X546,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X546,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_546)[1]))
colnames(empty_table) <-subfield_list
marc_field_546<-cbind(marc_field_546,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_546$X546 <- str_replace(marc_field_546$X546,subfield_list_char[i],"|\\1")
}
Progress: 1 on 2  Progress: 2 on 2  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_546[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_546$X546),str_replace_all(gsub(string,"\\3",marc_field_546$X546),"\\${2}.", "~"),NA)
}
Progress: 1 on 2  Progress: 2 on 2  
marc_field_546 <- marc_field_546 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))

za_opis_ks <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,do_opisu),by="ZA_UWAGI") %>%
  left_join(.,marc_field_300 %>% select(ZA_UWAGI,X300a=`$a`,X300b=`$b`,X300e=`$e`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_500 %>% select(ZA_UWAGI,X500a=`$a`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_546 %>% select(ZA_UWAGI,X546a=`$a`),by="ZA_UWAGI")
za_opis_ks[is.na(za_opis_ks)]  <- ""
za_opis_ks <- za_opis_ks %>%
  mutate(za_opis_ks = paste(ifelse(do_opisu!="",paste(as.character(do_opisu),", ",sep = ""),""),ifelse(X300a!="",paste(as.character(X300a),", ",sep = ""),""),ifelse(X300b!="",paste(as.character(X300b),", ",sep = ""),""),ifelse(X300e!="",paste(as.character(X300e),", ",sep = ""),""),ifelse(X500a!="",paste(as.character(X500a),", ",sep = ""),""),ifelse(X546a!="",as.character(X546a),""),sep = ""),
         za_opis_ks = str_remove(za_opis_ks,"(, )+$")) %>%
  select(ZA_UWAGI,za_opis_ks) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(za_opis_ks))
za_opis_ks$id_grupy <- cumsum(!duplicated(za_opis_ks[1]))
za_opis_ks <- za_opis_ks[!duplicated(za_opis_ks$id_grupy),] %>%
  select(-id_grupy)

#12: seria wydawnicza
marc_field_490 <- data %>%
  select(ZA_UWAGI,X490,X800,X830) %>%
  mutate(X490 = ifelse(grepl("U\\+",X490),as.character(X830),as.character(X490))) %>%
  mutate(X800 = ifelse(X490!="","",as.character(X800)),
         X830 = ifelse(X490!="","",as.character(X830)),
         X800 = str_replace(X800,"(\\$a)(.*)(\\$t)","\\1"),
         X490 = ifelse(X490==""&X830!="",as.character(X830),
                       ifelse(X490==""&X800!="",as.character(X800),as.character(X490)))) %>%
  select(ZA_UWAGI,X490) %>%
  filter(X490!="") %>%
  mutate(X490=str_replace_all(X490,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X490",sep = "~",direction = "long") %>%
  filter(X490!="") %>%
  mutate(X490=str_remove_all(X490,"^\\|")) %>%
  mutate(indicator = str_replace_all(X490,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X490,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_490)[1]))
colnames(empty_table) <-subfield_list
marc_field_490<-cbind(marc_field_490,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_490$X490 <- str_replace(marc_field_490$X490,subfield_list_char[i],"|\\1")
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_490[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_490$X490),str_replace_all(gsub(string,"\\3",marc_field_490$X490),"\\${2}.", "~"),NA)
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
za_seria_wydawnicza <- marc_field_490 %>%
  mutate(`$a` = str_replace_all(`$a`,"(=)(\\$a)","\\1 "),
         `$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$v` = ifelse(is.na(`$v`),"",as.character(`$v`))) %>%
  filter(!is.na(`$a`)) %>%
  mutate(seria = str_remove(paste("(",`$a`,"; ",`$v`,")",sep = ""),"; (?=\\)$)"),
         seria = gsub("( : )(.)",". \\U\\2",perl=TRUE,seria)) %>%
  select(ZA_UWAGI,seria) %>%
  group_by(ZA_UWAGI) %>%
  mutate(seria = paste(seria,collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(seria = str_replace_all(seria,"\\$.","; ")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#13: tomy
za_tomy <- data %>%
  select(ZA_UWAGI) %>%
  mutate(za_tomy = NA)

#14: adnotacje
za_adnotacje <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  mutate(ZA_ADNOTACJE = paste(ifelse(is.na(ZA_ADNOTACJE.x),"",paste(as.character(ZA_ADNOTACJE.x),"# ",sep = "")),ifelse(is.na(ZA_ADNOTACJE.y),"",as.character(ZA_ADNOTACJE.y)),sep = ""),
         ZA_ADNOTACJE = str_remove(ZA_ADNOTACJE,"(# )+$")) %>%
  select(ZA_UWAGI,ZA_ADNOTACJE) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(ZA_ADNOTACJE))
za_adnotacje$id_grupy <- cumsum(!duplicated(za_adnotacje[1]))
za_adnotacje <- za_adnotacje[!duplicated(za_adnotacje$id_grupy),] %>%
  select(-id_grupy)

#15: BN_URL
BN_URL <- data %>%
  select(ZA_UWAGI,BN_URL)

#wyrównanie liczby wierszy do liczby wierszy obiektu data
BN_autor <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,AM_AUTOR_ID,AM_NAZWISKO,AM_IMIE),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, AM_AUTOR_ID = paste(AM_AUTOR_ID, collapse="|"), AM_NAZWISKO = paste(AM_NAZWISKO, collapse="|"), AM_IMIE = paste(AM_IMIE, collapse="|"))
BN_wspoltworca <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,OS_OSOBA_ID,OS_NAZWISKO,OS_IMIE,fo_symbol),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, OS_OSOBA_ID = paste(OS_OSOBA_ID, collapse="|"), OS_NAZWISKO = paste(OS_NAZWISKO, collapse="|"), OS_IMIE = paste(OS_IMIE, collapse="|"), fo_symbol = paste(fo_symbol, collapse="|")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL","NA",as.character(fo_symbol)))
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, WY_WYDAWNICTWO_ID = paste(WY_WYDAWNICTWO_ID, collapse="|"), WY_NAZWA = paste(WY_NAZWA, collapse="|"), WY_MIASTO = paste(WY_MIASTO, collapse="|"), za_rok_wydania = paste(unique(za_rok_wydania), collapse="|")) %>%
  mutate(za_rok_wydania = ifelse(za_rok_wydania=="NA","",as.integer(za_rok_wydania)))
pojawi戼㸳y si攼㹡 warto㤼㹣ci NA na skutek przekszta戼㸳cenia
#połączenie wszystkich elementów w jedną tabelę
kolejnosc <- data.frame(kolejnosc=c("ZA_UWAGI","RZ_NAZWA","ZA_RO_ROK","ZA_TYPE","RZ_RODZAJ_ID","DZ_NAZWA","DZ_DZIAL_ID","TW_TWORCA_ID","AM_AUTOR_ID","AM_NAZWISKO","AM_IMIE","ZA_TYTUL","ZA_TYTUL_ORYGINALU","ZA_JEZYK_ORYGINALU","OS_OSOBA_ID","OS_NAZWISKO","OS_IMIE","fo_symbol","za_opis_wspoltworcow","wydanie","za_tomy","instytucja","WY_WYDAWNICTWO_ID","WY_MIASTO","WY_NAZWA","za_rok_wydania","za_opis_ks","seria","TW_NAZWISKO","TW_IMIE","redaktor_dzialu","ZA_ADNOTACJE","BN_URL"))
polaczone <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,pola_pbl,by = "ZA_UWAGI") %>%
  left_join(.,BN_autor,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,za_jezyk_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_wspoltworcow,by = "ZA_UWAGI") %>%
  left_join(.,za_wydanie,by = "ZA_UWAGI") %>%
  left_join(.,za_instytucja,by = "ZA_UWAGI") %>%
  left_join(.,BN_wydawnictwo,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_ks,by = "ZA_UWAGI") %>%
  left_join(.,za_seria_wydawnicza,by = "ZA_UWAGI") %>%
  left_join(.,za_tomy,by = "ZA_UWAGI") %>%
  left_join(.,za_adnotacje,by = "ZA_UWAGI") %>%
  left_join(.,BN_URL,by = "ZA_UWAGI") %>%
  select(as.vector(kolejnosc$kolejnosc))
colnames(polaczone) <- c("rekord_BN","rz_nazwa","za_ro_rok","za_type","rz_rodzaj_id","DZ_NAZWA","DZ_DZIAL_ID","tw_tworca_id","am_autor_id","am_nazwisko","am_imie","za_tytul","za_tytul_oryginalu","za_jezyk_oryginalu","os_osoba_id","os_nazwisko","os_imie","fo_symbol","za_opis_wspoltworcow","za_wydanie","za_tomy","za_instytucja","wy_wydawnictwo_id","wy_miejsce","wy_nazwa","za_rok_wydania","za_opis_fizyczny_ksiazki","za_seria_wydawnicza","tw_nazwisko","tw_imie","pracownik","za_adnotacje","BN_URL")

#zasygnalizowanie niepoprawnego kodowania
x <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("<U\\+(....)>",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)!=0,paste(polaczone$za_adnotacje,paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole.",sep = ""),sep = "# "),paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole.",sep = "")),as.character(polaczone$za_adnotacje))
  polaczone[,i] <- gsub("<U\\+(....)>", "???", polaczone[,i])
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku $ w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("\\$",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności frazy "character(0)" w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("character\\(0\\)",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku # w opisie współtwórców
polaczone$za_adnotacje <- ifelse(grepl("\\#",polaczone$za_opis_wspoltworcow),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności \"#\" współtwórcy z pola 700).",paste(polaczone$za_adnotacje,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności # współtwórcy z pola 700).",sep = "# ")),as.character(polaczone$za_adnotacje))
#korekta automatycznego IOK
automatyczny_IOK <- polaczone %>%
  mutate(czy_tyt_oryg = (!grepl("polsk",DZ_NAZWA)&!is.na(za_tytul_oryginalu))|grepl("polsk",DZ_NAZWA)) %>%
  filter(za_adnotacje==""&am_nazwisko!="NA"&!grepl("pseud|nazw",za_opis_fizyczny_ksiazki)&!grepl("\\|",am_nazwisko)&czy_tyt_oryg==TRUE,
         !grepl("szkic|felieton|list",str_replace(za_tytul,"(.*)(\\[.*$)","\\2"),ignore.case = TRUE)) %>%
  select(rekord_BN) %>%
  unique() %>%
  filter(rekord_BN %notin% data$ZA_UWAGI[data$czy_automatycznie=="nie"]) %>%
  mutate(powinno_byc = "IOK")
#aktualizacja - wpisz właściwy rok w ścieżkę pliku
write.csv2(automatyczny_IOK, "C:/Users/Cezary/Desktop/imp_2011_automatyczne_podmiotowe.csv", row.names = F, na = '', fileEncoding = 'UTF-8')

out <- cSplit(polaczone, c("am_autor_id", "am_nazwisko", "am_imie","os_osoba_id","os_nazwisko", "os_imie", "fo_symbol","wy_wydawnictwo_id","wy_miejsce","wy_nazwa"),sep = "|",direction = "long") %>%
  unique()

out$rekord_BN <- ifelse(is.na(out$rekord_BN),'',as.character(out$rekord_BN))
out$rz_nazwa <- ifelse(is.na(out$rz_nazwa),'',as.character(out$rz_nazwa))
out$za_ro_rok <- ifelse(is.na(out$za_ro_rok),'',as.character(out$za_ro_rok))
out$za_type <- ifelse(is.na(out$za_type),'',as.character(out$za_type))
out$rz_rodzaj_id <- ifelse(is.na(out$rz_rodzaj_id),'',as.character(out$rz_rodzaj_id))
out$DZ_NAZWA <- ifelse(is.na(out$DZ_NAZWA),'',as.character(out$DZ_NAZWA))
out$DZ_DZIAL_ID <- ifelse(is.na(out$DZ_DZIAL_ID),'',as.character(out$DZ_DZIAL_ID))
out$tw_tworca_id <- ifelse(is.na(out$tw_tworca_id),'',as.character(out$tw_tworca_id))
out$am_autor_id <- ifelse(is.na(out$am_autor_id),'',as.character(out$am_autor_id))
out$am_nazwisko <- ifelse(is.na(out$am_nazwisko),'',as.character(out$am_nazwisko))
out$am_imie <- ifelse(is.na(out$am_imie),'',as.character(out$am_imie))
out$za_tytul <- ifelse(is.na(out$za_tytul),'',as.character(out$za_tytul))
out$za_tytul_oryginalu <- ifelse(is.na(out$za_tytul_oryginalu),'',as.character(out$za_tytul_oryginalu))
out$za_jezyk_oryginalu <- ifelse(is.na(out$za_jezyk_oryginalu),'',as.character(out$za_jezyk_oryginalu))
out$os_osoba_id <- ifelse(is.na(out$os_osoba_id),'',as.character(out$os_osoba_id))
out$os_nazwisko <- ifelse(is.na(out$os_nazwisko),'',as.character(out$os_nazwisko))
out$os_imie <- ifelse(is.na(out$os_imie),'',as.character(out$os_imie))
out$fo_symbol <- ifelse(is.na(out$fo_symbol),'',as.character(out$fo_symbol))
out$za_opis_wspoltworcow <- ifelse(is.na(out$za_opis_wspoltworcow),'',as.character(out$za_opis_wspoltworcow))
out$za_wydanie <- ifelse(is.na(out$za_wydanie),'',as.character(out$za_wydanie))
out$za_tomy <- ifelse(is.na(out$za_tomy),'',as.character(out$za_tomy))
out$za_instytucja <- ifelse(is.na(out$za_instytucja),'',as.character(out$za_instytucja))
out$wy_wydawnictwo_id <- ifelse(is.na(out$wy_wydawnictwo_id),'',as.character(out$wy_wydawnictwo_id))
out$wy_miejsce <- ifelse(is.na(out$wy_miejsce),'',as.character(out$wy_miejsce))
out$wy_nazwa <- ifelse(is.na(out$wy_nazwa),'',as.character(out$wy_nazwa))
out$za_rok_wydania <- ifelse(is.na(out$za_rok_wydania),'',as.character(out$za_rok_wydania))
out$za_opis_fizyczny_ksiazki <- ifelse(is.na(out$za_opis_fizyczny_ksiazki),'',as.character(out$za_opis_fizyczny_ksiazki))
out$za_seria_wydawnicza <- ifelse(is.na(out$za_seria_wydawnicza),'',as.character(out$za_seria_wydawnicza))
out$tw_nazwisko <- ifelse(is.na(out$tw_nazwisko),'',as.character(out$tw_nazwisko))
out$tw_imie <- ifelse(is.na(out$tw_imie),'',as.character(out$tw_imie))
out$pracownik <- ifelse(is.na(out$pracownik),'',as.character(out$pracownik))
out$za_adnotacje <- ifelse(is.na(out$za_adnotacje),'',as.character(out$za_adnotacje))
out$BN_URL <- ifelse(is.na(out$BN_URL),'',as.character(out$BN_URL))

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same
out$same[1] <- 0
out$dzielone <- paste(out$am_autor_id,out$am_nazwisko,out$am_imie,out$os_osoba_id,out$os_nazwisko,out$os_imie,out$fo_symbol,out$wy_wydawnictwo_id,out$wy_miejsce,out$wy_nazwa,sep = "")

out <- out %>%
  filter(!(same==1&dzielone=="")) %>%
  select(1:33)

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same

#ucięcie zbyt długich ciągów znaków, by weszły do oracle'a
dlugosci <- data.frame(pole = c("am_nazwisko", "am_imie", "za_tytul", "za_tytul_oryginalu", "za_jezyk_oryginalu", "os_nazwisko", "os_imie", "za_opis_wspoltworcow", "za_instytucja", "wy_miejsce", "wy_nazwa", "za_opis_fizyczny_ksiazki", "za_seria_wydawnicza", "tw_nazwisko", "tw_imie", "za_adnotacje"), liczba_znakow = c(50,40,500,500,100,50,40,500,255,40,255,1000,255,200,40,2000))
x <- match(dlugosci$pole,names(out))
for (i in x) {
  progress(match(i,x), max.value = length(x))
  dlugosc <- dlugosci$liczba_znakow[match(names(out[i]),dlugosci$pole)]
  out$za_adnotacje <- ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje!="",paste(out$za_adnotacje,paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),sep = "# "),
                             ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje=="",paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),as.character(out$za_adnotacje)))
  
  out[,i] <- ifelse(dlugosc<nchar(as.character(out[,i])),as.character(substr(out[,i],1,dlugosc)),as.character(out[,i]))
}
Progress:  1 on 16  Progress:  2 on 16  Progress:  3 on 16  Progress:  4 on 16  Progress:  5 on 16  Progress:  6 on 16  Progress:  7 on 16  Progress:  8 on 16  Progress:  9 on 16  Progress: 10 on 16  Progress: 11 on 16  Progress: 12 on 16  Progress: 13 on 16  Progress: 14 on 16  Progress: 15 on 16  Progress: 16 on 16  
out$rekord_BN[out$same == 1] <- ""
out$rz_nazwa[out$same == 1] <- ""
out$za_ro_rok[out$same == 1] <- ""
out$za_type[out$same == 1] <- ""
out$rz_rodzaj_id[out$same == 1] <- ""
out$DZ_NAZWA[out$same == 1] <- ""
out$DZ_DZIAL_ID[out$same == 1] <- ""
out$tw_tworca_id[out$same == 1] <- ""
out$za_tytul[out$same == 1] <- ""
out$za_tytul_oryginalu[out$same == 1] <- ""
out$za_jezyk_oryginalu[out$same == 1] <- ""
out$za_opis_wspoltworcow[out$same == 1] <- ""
out$za_wydanie[out$same == 1] <- ""
out$za_tomy[out$same == 1] <- ""
out$za_instytucja[out$same == 1] <- ""
out$za_rok_wydania[out$same == 1] <- ""
out$za_opis_fizyczny_ksiazki[out$same == 1] <- ""
out$za_seria_wydawnicza[out$same == 1] <- ""
out$tw_nazwisko[out$same == 1] <- ""
out$tw_imie[out$same == 1] <- ""
out$pracownik[out$same == 1] <- ""
out$za_adnotacje[out$same == 1] <- ""
out$BN_URL[out$same == 1] <- ""

#przypisanie do automatycznego OK redaktora "automat"
out <- out %>%
  mutate(pracownik = ifelse(rekord_BN %in% automatyczny_IOK$rekord_BN,"AUTOMAT",as.character(pracownik))) %>%
  select(1:33)

#pętla zapisująca po ok. 2000 wierszy z uwzględnieniem kompletności rekordów bibliograficznych rozpisanych na kilka wierszy
out <- out %>%
  mutate(podzial = ifelse(rekord_BN!="",as.character(rekord_BN),NA)) %>%
  fill(podzial)
ile <- unique(out$podzial)
ile <- split(unique(ile), ceiling(seq_along(unique(ile))/1500))
#aktualizacja - wpisz właściwy rok w ścieżkę pliku
x <- 1:length(ile)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  final <- out %>%
    filter(podzial %in% ile[[i]]) %>%
    select(-podzial)
  write.xlsx(final, paste("C:/Users/Cezary/Desktop/2011_podmiotowa_do_importu",i,".xlsx",sep = ""),sheetName = "gotowe")
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
bn_ok <- chunk11
data <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  mutate(redaktor_dzialu = paste(redaktor_dzialu,"_przedm",sep = ""))
#uwolnienie kolumn z danymi z bn i przetworzenie do PBL
#1: za_uwagi, rz_nazwa, za_ro_rok, za_type, rz_rodzaj_id, tw_tworca_id, tw_nazwisko, tw_imie, dz_dzial_id, dz_nazwa, redaktor_dzialu
pola_pbl <- data %>%
  select(ZA_UWAGI, RZ_NAZWA, ZA_RO_ROK = rok, RZ_RODZAJ_ID, TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, redaktor_dzialu) %>%
  mutate(ZA_TYPE = "KS")
#2: autor
BN_autor <- data %>%
  select(X100,X245,ZA_UWAGI)
#pole 100
marc_field_100 <- BN_autor %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(BN_autor$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}

#pole 245
marc_field_245 <- BN_autor %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(BN_autor$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}

BN_autor <- marc_field_100 %>%
  select(ZA_UWAGI,`$a`,`$b`) %>%
  unique() %>%
  mutate(`$a` = ifelse(!is.na(`$b`),paste(`$a`,`$b`,sep = " "),as.character(`$a`))) %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  unique() %>%
  mutate(AM_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                              ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
         AM_IMIE = ifelse(grepl("\\|",`$a`),"*",
                          ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE) %>%
  left_join(.,marc_field_245,by="ZA_UWAGI") %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE, X245c = `$c`)
  
x <- 1:lengths(BN_autor[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_autor$czy_nazwisko[i] <- grepl(BN_autor$AM_NAZWISKO[i],BN_autor$X245c[i])
  BN_autor$czy_imie[i] <- grepl(BN_autor$AM_IMIE[i],BN_autor$X245c[i])
}

BN_autor <- BN_autor %>%
  mutate(ZA_ADNOTACJE = ifelse(czy_nazwisko==FALSE|czy_imie==FALSE,paste("UWAGA! Konflikt w danych osobowych w polach 100 i 245. Porównaj pole autor w formularzu z polem BN: ",X245c,sep = ""),NA)) %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,ZA_ADNOTACJE) %>%
  mutate(nazwa = str_replace_all(str_to_lower(paste(AM_NAZWISKO,AM_IMIE, sep = "")), "\\W", "")) %>%
  left_join(.,PBL_autorzy %>% select(AM_AUTOR_ID,AM_KRYPTONIM,AM_LICZBA_ZAPISOW,nazwa) %>% filter(is.na(AM_KRYPTONIM)),by="nazwa") %>%
  arrange(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,-AM_LICZBA_ZAPISOW)
BN_autor$id_grupy <- cumsum(!duplicated(BN_autor[1:3]))
BN_autor <- BN_autor[!duplicated(BN_autor$id_grupy),] %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,ZA_ADNOTACJE,AM_AUTOR_ID)

#3: tytuł
#pole 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}

za_tytul <- marc_field_245 %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = " "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = " "),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = " "),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  unite("ZA_TYTUL",`$a`:`$p`,sep = " ",na.rm = TRUE) %>%
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL," +"," "),
         ZA_TYTUL = str_remove(ZA_TYTUL, "\\s+\\/\\s{0,}$"),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\.{3} \\.{3}","... "),
         ZA_TYTUL = str_replace_all(ZA_TYTUL," ; ",". "),
         ZA_TYTUL = gsub("( : )(.)",". \\U\\2",perl=TRUE,ZA_TYTUL)) %>%
  select(ZA_UWAGI,ZA_TYTUL)

#4: tytuł oryginału
#pole 246
marc_field_246 <- data %>%
  select(ZA_UWAGI,X246)%>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"~"),
         X246=str_replace_all(X246,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X246",sep = "~",direction = "long") %>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"^\\|")) %>%
  mutate(indicator = str_replace_all(X246,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X246,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_246)[1]))
colnames(empty_table) <-subfield_list
marc_field_246<-cbind(marc_field_246,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_246$X246 <- str_replace(marc_field_246$X246,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_246[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_246$X246),str_replace_all(gsub(string,"\\3",marc_field_246$X246),"\\${2}.", "~"),NA)
}

if("$n" %in% colnames(marc_field_246)) {
marc_field_246 <- marc_field_246[, colSums(is.na(marc_field_246)) != nrow(marc_field_246)] %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = ""),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = ""),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = "")) %>%
  ungroup() %>%
  unique() %>%
  unite("X246",`$a`:`$p`,sep = " ",na.rm = TRUE) %>% 
  mutate(X246 = str_replace_all(X246," +"," "),
         X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
         X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
  select(ZA_UWAGI, X246)
} else {
  marc_field_246 <- marc_field_246[, colSums(is.na(marc_field_246)) != nrow(marc_field_246)] %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`,`$b`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = "")) %>%
  ungroup() %>%
  unique() %>%
  unite("X246",`$a`:`$b`,sep = " ",na.rm = TRUE) %>% 
  mutate(X246 = str_replace_all(X246," +"," "),
         X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
         X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
  select(ZA_UWAGI, X246)
}

#pole 500
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"~"),
         X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
marc_field_500 <- marc_field_500 %>%
  filter(grepl("oryg\\.\\:",X500)) %>%
  mutate(X500 = str_remove(`$a`,"^Tyt\\. oryg\\.: |^Tyt\\, oryg\\.: |^.*?tyt\\. oryg\\.: "),
         X500 = str_remove(X500, "\\s+\\/\\s{0,}$"),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = str_replace_all(X500,"\\.{3} \\.{3}","... "),
         X500 = str_remove(X500, "\\.$"),
         X500 = str_remove(X500,"(,{0,1} {0,1})\\d{4}.*$|(, t|. T)yt. oryg. cyklu:")) %>%
  select(ZA_UWAGI,X500)
#tytuł oryginału
za_tytul_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_246,by="ZA_UWAGI") %>%
  left_join(.,marc_field_500,by="ZA_UWAGI") %>%
  mutate(X500 = ifelse(is.na(X500),NA,
                       ifelse(grepl("oryg",X500),NA,as.character(X500))),
         X500 = ifelse(!is.na(X500)&grepl("\\. - ",X500),str_replace(X500,"(.*?)(\\. - .*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Na książce pseud",X500),str_replace(X500,"(.*?)(\\. Na książce pseud.*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Przekł\\. wg",X500),str_replace(X500,"(.*?)(\\. Przekł\\. wg.*$)","\\1"),as.character(X500)),
         ZA_TYTUL_ORYGINALU = ifelse(is.na(X246)&is.na(X500),NA,
                                     ifelse(!is.na(X500),as.character(X500),as.character(X246))),
         ZA_TYTUL_ORYGINALU = str_remove_all(ZA_TYTUL_ORYGINALU,'\\"')) %>%
  select(ZA_UWAGI,ZA_TYTUL_ORYGINALU)
#5: język oryginału
marc_field_041 <- data %>%
  select(ZA_UWAGI,X041)%>%
  filter(X041!="") %>%
  mutate(X041=str_replace_all(X041,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X041",sep = "~",direction = "long") %>%
  filter(X041!="") %>%
  mutate(X041=str_remove_all(X041,"^\\|")) %>%
  mutate(indicator = str_replace_all(X041,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X041,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_041)[1]))
colnames(empty_table) <-subfield_list
marc_field_041<-cbind(marc_field_041,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_041$X041 <- str_replace(marc_field_041$X041,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_041[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_041$X041),str_replace_all(gsub(string,"\\3",marc_field_041$X041),"\\${2}.", "~"),NA)
}
za_jezyk_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_041 %>% select(ZA_UWAGI,ZA_JEZYK_ORYGINALU = `$a`),by="ZA_UWAGI") %>%
  mutate(ZA_JEZYK_ORYGINALU = str_replace_all(ZA_JEZYK_ORYGINALU,"\\$a",",")) %>%
  unique()

#6: współtwórcy
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}

BN_wspoltworca <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         ws_prosty = str_replace_all(str_to_lower(osoba), "\\W", ""),
         fu_prosta = str_replace_all(str_to_lower(funkcja), "\\W", "")) %>%
  left_join(.,PBL_wspoltworcy %>% select(OS_OSOBA_ID,OS_LICZBA_ZAPISOW,nazwa_prosta),by=c("ws_prosty"="nazwa_prosta")) %>%
  arrange(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,-OS_LICZBA_ZAPISOW)
BN_wspoltworca$id_grupy <- cumsum(!duplicated(BN_wspoltworca[1:2]))
BN_wspoltworca <- BN_wspoltworca[!duplicated(BN_wspoltworca$id_grupy),] %>%
  left_join(.,PBL_funkcje,by=c("fu_prosta"="nazwa")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL",NA,as.character(fo_symbol))) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja)

#tutaj przeszukać X245 i znaleźć błędy współtwórców
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`)

BN_wspoltworca <- BN_wspoltworca %>%
  left_join(.,marc_field_245,by="ZA_UWAGI")

x <- 1:lengths(BN_wspoltworca[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_wspoltworca$czy_nazwisko[i] <- str_detect(BN_wspoltworca$X245c[i],BN_wspoltworca$OS_NAZWISKO[i])
  BN_wspoltworca$czy_imie[i] <- grepl(BN_wspoltworca$OS_IMIE[i],BN_wspoltworca$X245c[i])
}

BN_wspoltworca <- BN_wspoltworca %>%
  mutate(ZA_ADNOTACJE = ifelse(czy_nazwisko==FALSE|czy_imie==FALSE,paste("UWAGA! Konflikt w danych osobowych w polach 700 i 245. Porównaj pola współtórców w formularzu z polem BN: ",X245c,sep = ""),NA)) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja,ZA_ADNOTACJE)

#7: opis współtwórców
opis_wspoltworcow <- BN_wspoltworca %>%
  select(ZA_UWAGI,funkcja,OS_IMIE,OS_NAZWISKO) %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  filter(!is.na(OS_NAZWISKO)|(is.na(OS_NAZWISKO)&grepl("et al\\.",X245c))) %>%
  mutate(jest_et_al = grepl("et al\\.",X245c),
         OS_IMIE = ifelse(OS_IMIE=="*","",as.character(OS_IMIE)),
         opis = ifelse(!is.na(OS_NAZWISKO),paste(funkcja,OS_IMIE, OS_NAZWISKO, sep = " "),""),
         opis = str_replace_all(opis," +"," "),
         opis = ifelse(opis==" ","",as.character(opis))) %>%
  select(ZA_UWAGI,opis,jest_et_al) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ", "),
         jest_et_al = paste(unique(jest_et_al),sep = "")) %>%
  ungroup() %>%
  unique() %>%
  mutate(opis = ifelse(jest_et_al==TRUE&opis=="","et al.",
                       ifelse(jest_et_al,paste(opis,"et al.",sep = " "),opis))) %>%
  select(ZA_UWAGI,opis)

#700
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
marc_field_700 <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         funkcja_duza = str_to_lower(funkcja),
         opis = paste(funkcja_duza,OS_IMIE,OS_NAZWISKO, sep = " "),
         opis_duzy = paste(funkcja,OS_IMIE,OS_NAZWISKO, sep = " ")) %>%
  select(ZA_UWAGI,opis,opis_duzy) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ". "),
         opis_duzy = paste(opis_duzy,collapse = ". ")) %>%
  ungroup() %>%
  unique()

#opis współtwórców ze strefy odpowiedzialności 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$c`)

#porównanie opisu współtwórców z 245 i 700
wspoltworcy <- marc_field_700 %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  cSplit(.,"$c",sep = " ; ",direction = "long") %>%
  #ograniczanie osób ze strefy odpowiedzialności
  mutate(czy_mala = grepl(" [a-zęóąśłżźćń]|^[a-zęóąśłżźćń]|\\[[a-zęóąśłżźćń]",`$c`,ignore.case = FALSE)) %>%
  filter(czy_mala==TRUE) %>%
  select(-czy_mala) %>%
  #mutate(`$c` = gsub("^(\\[){0,1}([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])","\\1\\U\\2",perl = TRUE,`$c`)) %>%
  group_by(ZA_UWAGI) %>%
  mutate(X245 = paste(`$c`, collapse = ", ")) %>%
  select(-`$c`) %>%
  unique() %>%
  mutate(order_pbl = as.character(str_extract_all(opis,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_pbl = str_replace_all(order_pbl,"(.*?\")(.)(\".*?.)", "\\2"),
         order_bn = as.character(str_extract_all(X245,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_bn = str_replace_all(order_bn,"(.*?\")(.)(\".*?.)", "\\2"),
         X245 = str_remove(X245, "\\.$"),
         X245 = str_remove(X245, "\\["),
         X245 = str_remove(X245, "\\]"),
         order_pbl = str_remove_all(order_pbl, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         order_bn = str_remove_all(order_bn, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         to_samo = order_pbl==order_bn,
         X245 = gsub("(^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(.*)","\\U\\1\\E\\2",perl = TRUE, X245)) %>%
  left_join(.,za_jezyk_oryginalu,by="ZA_UWAGI") %>%
  mutate(czy_pl = grepl("pol",ZA_JEZYK_ORYGINALU)|is.na(ZA_JEZYK_ORYGINALU),
         decyzja = ifelse(to_samo==FALSE|czy_pl==FALSE,FALSE,TRUE))

za_opis_wspoltworcow <- wspoltworcy %>%
  mutate(za_opis_wspoltworcow = ifelse(decyzja==TRUE,as.character(X245),paste(X245,opis_duzy,sep = "#"))) %>%
  select(ZA_UWAGI,opis_duzy,za_opis_wspoltworcow) %>%
  cSplit(.,"za_opis_wspoltworcow",sep = "#",direction = "wide") %>%
  mutate(za_opis_wspoltworcow_2 = ifelse(is.na(za_opis_wspoltworcow_2),'',as.character(za_opis_wspoltworcow_2)),
         to_samo = za_opis_wspoltworcow_1==za_opis_wspoltworcow_2) %>%
  filter(to_samo==FALSE) %>%
  group_by(ZA_UWAGI) %>%
  mutate(za_opis_wspoltworcow = paste(za_opis_wspoltworcow_1,za_opis_wspoltworcow_2,sep = "#"),
         za_opis_wspoltworcow = str_remove_all(za_opis_wspoltworcow,"\\#$")) %>%
  select(ZA_UWAGI,za_opis_wspoltworcow)

opis_wspoltworcow <- opis_wspoltworcow %>%
  filter(ZA_UWAGI %notin% za_opis_wspoltworcow$ZA_UWAGI) %>%
  filter(!is.na(opis)) %>%
  rename(za_opis_wspoltworcow = opis)

za_opis_wspoltworcow <- za_opis_wspoltworcow %>%
  bind_rows(.,opis_wspoltworcow) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#8 wydanie
marc_field_250 <- data %>%
  select(ZA_UWAGI,X250)%>%
  filter(X250!="") %>%
  mutate(X250=str_replace_all(X250,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X250",sep = "~",direction = "long") %>%
  filter(X250!="") %>%
  mutate(X250=str_remove_all(X250,"^\\|")) %>%
  mutate(indicator = str_replace_all(X250,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X250,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_250)[1]))
colnames(empty_table) <-subfield_list
marc_field_250<-cbind(marc_field_250,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_250$X250 <- str_replace(marc_field_250$X250,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_250[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_250$X250),str_replace_all(gsub(string,"\\3",marc_field_250$X250),"\\${2}.", "~"),NA)
}

za_wydanie <- marc_field_250 %>%
  select(ZA_UWAGI, wydanie = `$a`) %>%
  mutate(wydanie = str_remove(wydanie," \\/$")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#9: instytucja sprawcza
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}

za_instytucja <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`) %>%
  filter(!is.na(X245c)) %>%
  mutate(instytucja = ifelse(grepl("\\;",X245c),str_replace_all(X245c, "(.*?)(\\;(?!.*\\;))( )+(.*?$)","\\4"),"")) %>%
  left_join(.,BN_wspoltworca,by="ZA_UWAGI")

x <- 1:lengths(za_instytucja[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  za_instytucja$czy_nazwisko[i] <- grepl(za_instytucja$OS_NAZWISKO[i],za_instytucja$X245c[i])
  za_instytucja$czy_imie[i] <- grepl(za_instytucja$OS_IMIE[i],za_instytucja$X245c[i])
}

za_instytucja <- za_instytucja %>%
  filter(is.na(czy_nazwisko)&is.na(czy_imie)) %>%
  filter(instytucja!="") %>%
  filter(!grepl("^\\[[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]|^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]",instytucja)) %>%
  mutate(instytucja = str_remove(instytucja,"\\.$")) %>%
  select(ZA_UWAGI,instytucja) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#10: wydawnictwo
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI, X260) %>%
  mutate(X260 = str_replace_all(X260,"s\\.n\\.", "b.w."), 
         X260 = str_replace_all(X260,"s\\.l\\.", "b.m."), 
         X260 = str_replace_all(X260,"S\\.l\\.", "b.m."), 
         X260 = str_remove(X260,"^\\\\+"), 
         rok_wydania = str_extract_all(X260, "(?<=\\$c).*(?=\\$e)|(?<=\\$c).*"), 
         bez_roku = str_replace_all(X260, ".\\$c.*", ""), 
         ile_wydawnictw = str_count(bez_roku, "\\$b"),
         ile_miejsc = str_count(bez_roku, "\\$a"),
         kolejnosc = str_replace_all(as.character(str_extract_all(bez_roku, "\\$.")), "[^a-z]", ""),
         bez_roku = str_replace_all(bez_roku, ";\\$b", ":$b"),
         wydaw_podziel = ifelse(ile_wydawnictw>ile_miejsc|kolejnosc=="caabb", str_replace_all(bez_roku, "(\\$a)(.*?)( :\\$b.*?)( :\\$b)", "\\1\\2\\3 ;$a\\2\\4"),bez_roku),
         wydawnictwo_test = str_replace_all(wydaw_podziel, "(\\$b)(.*?)( ;\\$a)", "\\1\\2|\\3")) %>%
  select(ZA_UWAGI,rok_wydania,wydawnictwo_test) %>%
  cSplit(., "wydawnictwo_test", sep = "|", direction = "long") %>%
  mutate(wydawnictwo = str_extract_all(wydawnictwo_test, "(?<=\\$b)(.*)"),
         miejsce_wydania = str_replace_all(str_extract_all(wydawnictwo_test, "(?<=\\$a)(.*)(?= {0,1}: {0,1}\\$b)|(?<=\\$a)(.*)($)")," ;\\$a", ", "),
         nazwa_prosta = str_to_lower(str_replace_all(str_replace_all(unlist(wydawnictwo_test), "\\$\\w", ""), "\\W", ""))) %>%
  left_join(.,PBL_wydawnictwa,by="nazwa_prosta") %>%
  mutate(to_samo = wydawnictwo==WY_NAZWA) %>%
  arrange(ZA_UWAGI,-to_samo,-WY_LICZBA_ZAPISOW)
BN_wydawnictwo$id_grupy <- cumsum(!duplicated(BN_wydawnictwo[1:3]))
BN_wydawnictwo <- BN_wydawnictwo[!duplicated(BN_wydawnictwo$id_grupy),] %>%
  mutate(WY_NAZWA = ifelse(!is.na(WY_NAZWA),as.character(WY_NAZWA),as.character(wydawnictwo)),
         WY_MIASTO = ifelse(!is.na(WY_MIASTO),as.character(WY_MIASTO),as.character(miejsce_wydania)),
         rok_wydania = str_replace_all(rok_wydania, "(.*)(\\.)", "\\1"),
         za_rok_wydania = ifelse(nchar(rok_wydania)==4,as.character(rok_wydania),NA),
         do_opisu = ifelse(is.na(za_rok_wydania),paste("[",str_extract(rok_wydania,"\\d{4}"),"]",sep = ""),""),
         WY_MIASTO = ifelse(substr(WY_MIASTO,1,1)=="["&substr(WY_MIASTO,nchar(WY_MIASTO),nchar(WY_MIASTO))!="]"&is.na(WY_WYDAWNICTWO_ID),paste(trim(WY_MIASTO),"]",sep = ""),as.character(WY_MIASTO))) %>%
  select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania,do_opisu)

#11: opis fizyczny książki
#pole 300 do opisu fizycznego
marc_field_300 <- data %>%
  select(ZA_UWAGI,X300)%>%
  filter(X300!="") %>%
  mutate(X300=str_replace_all(X300,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X300",sep = "~",direction = "long") %>%
  filter(X300!="") %>%
  mutate(X300=str_remove_all(X300,"^\\|")) %>%
  mutate(indicator = str_replace_all(X300,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X300,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_300)[1]))
colnames(empty_table) <-subfield_list
marc_field_300<-cbind(marc_field_300,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_300$X300 <- str_replace(marc_field_300$X300,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_300[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_300$X300),str_replace_all(gsub(string,"\\3",marc_field_300$X300),"\\${2}.", "~"),NA)
}
marc_field_300 <- marc_field_300 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$b` = str_remove(`$b`," \\;+$| \\:+$"),
         `$e` = ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`)&grepl("\\+ dysk|płyt",`$e`),str_extract(`$e`,"(?<=\\+)(dysk|płyt.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),
                       ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`),str_extract(`$e`,"(^.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),NA)),
         `$a` = ifelse(is.na(`$a`),"",as.character(`$a`)),
         `$b` = ifelse(is.na(`$b`),"",as.character(`$b`)),
         `$e` = ifelse(is.na(`$e`),"",as.character(`$e`)))
#pole 500 do opisu fizycznego
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
marc_field_500 <- marc_field_500 %>%
  mutate(`$a` = ifelse(grepl("oryg(\\.|\\,)",X500)&grepl("pseud|nazwa",X500,ignore.case = TRUE),str_replace(`$a`,"(^.*?)(\\. )(\\p{Lu}.*$)","\\3"),as.character(`$a`))) %>% 
  filter(!grepl("oryg(\\.|\\,)",`$a`)&grepl("pseud|nazwa|dotycz|pol",`$a`,ignore.case = TRUE)) %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))
  
#pole 546 do opisu fizycznego
marc_field_546 <- data %>%
  select(ZA_UWAGI,X546)%>%
  filter(X546!="") %>%
  mutate(X546=str_replace_all(X546,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X546",sep = "~",direction = "long") %>%
  filter(X546!="") %>%
  mutate(X546=str_remove_all(X546,"^\\|")) %>%
  mutate(indicator = str_replace_all(X546,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X546,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_546)[1]))
colnames(empty_table) <-subfield_list
marc_field_546<-cbind(marc_field_546,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_546$X546 <- str_replace(marc_field_546$X546,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_546[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_546$X546),str_replace_all(gsub(string,"\\3",marc_field_546$X546),"\\${2}.", "~"),NA)
}
marc_field_546 <- marc_field_546 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))

za_opis_ks <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,do_opisu),by="ZA_UWAGI") %>%
  left_join(.,marc_field_300 %>% select(ZA_UWAGI,X300a=`$a`,X300b=`$b`,X300e=`$e`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_500 %>% select(ZA_UWAGI,X500a=`$a`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_546 %>% select(ZA_UWAGI,X546a=`$a`),by="ZA_UWAGI")
za_opis_ks[is.na(za_opis_ks)]  <- ""
za_opis_ks <- za_opis_ks %>%
  mutate(za_opis_ks = paste(ifelse(do_opisu!="",paste(as.character(do_opisu),", ",sep = ""),""),ifelse(X300a!="",paste(as.character(X300a),", ",sep = ""),""),ifelse(X300b!="",paste(as.character(X300b),", ",sep = ""),""),ifelse(X300e!="",paste(as.character(X300e),", ",sep = ""),""),ifelse(X500a!="",paste(as.character(X500a),", ",sep = ""),""),ifelse(X546a!="",as.character(X546a),""),sep = ""),
         za_opis_ks = str_remove(za_opis_ks,"(, )+$")) %>%
  select(ZA_UWAGI,za_opis_ks) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(za_opis_ks))
za_opis_ks$id_grupy <- cumsum(!duplicated(za_opis_ks[1]))
za_opis_ks <- za_opis_ks[!duplicated(za_opis_ks$id_grupy),] %>%
  select(-id_grupy)

#12: seria wydawnicza
marc_field_490 <- data %>%
  select(ZA_UWAGI,X490,X800,X830) %>%
  mutate(X490 = ifelse(grepl("U\\+",X490),as.character(X830),as.character(X490))) %>%
  mutate(X800 = ifelse(X490!="","",as.character(X800)),
         X830 = ifelse(X490!="","",as.character(X830)),
         X800 = str_replace(X800,"(\\$a)(.*)(\\$t)","\\1"),
         X490 = ifelse(X490==""&X830!="",as.character(X830),
                       ifelse(X490==""&X800!="",as.character(X800),as.character(X490)))) %>%
  select(ZA_UWAGI,X490) %>%
  filter(X490!="") %>%
  mutate(X490=str_replace_all(X490,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X490",sep = "~",direction = "long") %>%
  filter(X490!="") %>%
  mutate(X490=str_remove_all(X490,"^\\|")) %>%
  mutate(indicator = str_replace_all(X490,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X490,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_490)[1]))
colnames(empty_table) <-subfield_list
marc_field_490<-cbind(marc_field_490,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_490$X490 <- str_replace(marc_field_490$X490,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_490[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_490$X490),str_replace_all(gsub(string,"\\3",marc_field_490$X490),"\\${2}.", "~"),NA)
}
za_seria_wydawnicza <- marc_field_490 %>%
  mutate(`$a` = str_replace_all(`$a`,"(=)(\\$a)","\\1 "),
         `$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$v` = ifelse(is.na(`$v`),"",as.character(`$v`))) %>%
  filter(!is.na(`$a`)) %>%
  mutate(seria = str_remove(paste("(",`$a`,"; ",`$v`,")",sep = ""),"; (?=\\)$)"),
         seria = gsub("( : )(.)",". \\U\\2",perl=TRUE,seria)) %>%
  select(ZA_UWAGI,seria) %>%
  group_by(ZA_UWAGI) %>%
  mutate(seria = paste(seria,collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(seria = str_replace_all(seria,"\\$.","; ")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#13: tomy
za_tomy <- data %>%
  select(ZA_UWAGI) %>%
  mutate(za_tomy = NA)

#14: adnotacje
za_adnotacje <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  mutate(ZA_ADNOTACJE = paste(ifelse(is.na(ZA_ADNOTACJE.x),"",paste(as.character(ZA_ADNOTACJE.x),"# ",sep = "")),ifelse(is.na(ZA_ADNOTACJE.y),"",as.character(ZA_ADNOTACJE.y)),sep = ""),
         ZA_ADNOTACJE = str_remove(ZA_ADNOTACJE,"(# )+$")) %>%
  select(ZA_UWAGI,ZA_ADNOTACJE) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(ZA_ADNOTACJE))
za_adnotacje$id_grupy <- cumsum(!duplicated(za_adnotacje[1]))
za_adnotacje <- za_adnotacje[!duplicated(za_adnotacje$id_grupy),] %>%
  select(-id_grupy)

#15: BN_URL
BN_URL <- data %>%
  select(ZA_UWAGI,BN_URL)

#wyrównanie liczby wierszy do liczby wierszy obiektu data
BN_autor <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,AM_AUTOR_ID,AM_NAZWISKO,AM_IMIE),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, AM_AUTOR_ID = paste(AM_AUTOR_ID, collapse="|"), AM_NAZWISKO = paste(AM_NAZWISKO, collapse="|"), AM_IMIE = paste(AM_IMIE, collapse="|"))
BN_wspoltworca <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,OS_OSOBA_ID,OS_NAZWISKO,OS_IMIE,fo_symbol),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, OS_OSOBA_ID = paste(OS_OSOBA_ID, collapse="|"), OS_NAZWISKO = paste(OS_NAZWISKO, collapse="|"), OS_IMIE = paste(OS_IMIE, collapse="|"), fo_symbol = paste(fo_symbol, collapse="|")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL","NA",as.character(fo_symbol)))
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, WY_WYDAWNICTWO_ID = paste(WY_WYDAWNICTWO_ID, collapse="|"), WY_NAZWA = paste(WY_NAZWA, collapse="|"), WY_MIASTO = paste(WY_MIASTO, collapse="|"), za_rok_wydania = paste(unique(za_rok_wydania), collapse="|")) %>%
  mutate(za_rok_wydania = ifelse(za_rok_wydania=="NA","",as.integer(za_rok_wydania)))

#połączenie wszystkich elementów w jedną tabelę
kolejnosc <- data.frame(kolejnosc=c("ZA_UWAGI","RZ_NAZWA","ZA_RO_ROK","ZA_TYPE","RZ_RODZAJ_ID","DZ_NAZWA","DZ_DZIAL_ID","TW_TWORCA_ID","AM_AUTOR_ID","AM_NAZWISKO","AM_IMIE","ZA_TYTUL","ZA_TYTUL_ORYGINALU","ZA_JEZYK_ORYGINALU","OS_OSOBA_ID","OS_NAZWISKO","OS_IMIE","fo_symbol","za_opis_wspoltworcow","wydanie","za_tomy","instytucja","WY_WYDAWNICTWO_ID","WY_MIASTO","WY_NAZWA","za_rok_wydania","za_opis_ks","seria","TW_NAZWISKO","TW_IMIE","redaktor_dzialu","ZA_ADNOTACJE","BN_URL"))
polaczone <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,pola_pbl,by = "ZA_UWAGI") %>%
  left_join(.,BN_autor,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,za_jezyk_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_wspoltworcow,by = "ZA_UWAGI") %>%
  left_join(.,za_wydanie,by = "ZA_UWAGI") %>%
  left_join(.,za_instytucja,by = "ZA_UWAGI") %>%
  left_join(.,BN_wydawnictwo,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_ks,by = "ZA_UWAGI") %>%
  left_join(.,za_seria_wydawnicza,by = "ZA_UWAGI") %>%
  left_join(.,za_tomy,by = "ZA_UWAGI") %>%
  left_join(.,za_adnotacje,by = "ZA_UWAGI") %>%
  left_join(.,BN_URL,by = "ZA_UWAGI") %>%
  select(as.vector(kolejnosc$kolejnosc))
colnames(polaczone) <- c("rekord_BN","rz_nazwa","za_ro_rok","za_type","rz_rodzaj_id","DZ_NAZWA","DZ_DZIAL_ID","tw_tworca_id","am_autor_id","am_nazwisko","am_imie","za_tytul","za_tytul_oryginalu","za_jezyk_oryginalu","os_osoba_id","os_nazwisko","os_imie","fo_symbol","za_opis_wspoltworcow","za_wydanie","za_tomy","za_instytucja","wy_wydawnictwo_id","wy_miejsce","wy_nazwa","za_rok_wydania","za_opis_fizyczny_ksiazki","za_seria_wydawnicza","tw_nazwisko","tw_imie","pracownik","za_adnotacje","BN_URL")

#zasygnalizowanie niepoprawnego kodowania
x <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("<U\\+(....)>",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)!=0,paste(polaczone$za_adnotacje,paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole",sep = ""),sep = "# "),paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole",sep = "")),as.character(polaczone$za_adnotacje))
  polaczone[,i] <- gsub("<U\\+(....)>", "???", polaczone[,i])
}
#zasygnalizowanie obecności znaku $ w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("\\$",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
#zasygnalizowanie obecności frazy "character(0)" w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("character\\(0\\)",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
#zasygnalizowanie obecności znaku # w opisie współtwórców
polaczone$za_adnotacje <- ifelse(grepl("\\#",polaczone$za_opis_wspoltworcow),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności \"#\" współtwórcy z pola 700)",paste(polaczone$za_adnotacje,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności # współtwórcy z pola 700)",sep = "# ")),as.character(polaczone$za_adnotacje))

out <- cSplit(polaczone, c("am_autor_id", "am_nazwisko", "am_imie","os_osoba_id","os_nazwisko", "os_imie", "fo_symbol","wy_wydawnictwo_id","wy_miejsce","wy_nazwa"),sep = "|",direction = "long") %>%
  unique()

out$rekord_BN <- ifelse(is.na(out$rekord_BN),'',as.character(out$rekord_BN))
out$rz_nazwa <- ifelse(is.na(out$rz_nazwa),'',as.character(out$rz_nazwa))
out$za_ro_rok <- ifelse(is.na(out$za_ro_rok),'',as.character(out$za_ro_rok))
out$za_type <- ifelse(is.na(out$za_type),'',as.character(out$za_type))
out$rz_rodzaj_id <- ifelse(is.na(out$rz_rodzaj_id),'',as.character(out$rz_rodzaj_id))
out$DZ_NAZWA <- ifelse(is.na(out$DZ_NAZWA),'',as.character(out$DZ_NAZWA))
out$DZ_DZIAL_ID <- ifelse(is.na(out$DZ_DZIAL_ID),'',as.character(out$DZ_DZIAL_ID))
out$tw_tworca_id <- ifelse(is.na(out$tw_tworca_id),'',as.character(out$tw_tworca_id))
out$am_autor_id <- ifelse(is.na(out$am_autor_id),'',as.character(out$am_autor_id))
out$am_nazwisko <- ifelse(is.na(out$am_nazwisko),'',as.character(out$am_nazwisko))
out$am_imie <- ifelse(is.na(out$am_imie),'',as.character(out$am_imie))
out$za_tytul <- ifelse(is.na(out$za_tytul),'',as.character(out$za_tytul))
out$za_tytul_oryginalu <- ifelse(is.na(out$za_tytul_oryginalu),'',as.character(out$za_tytul_oryginalu))
out$za_jezyk_oryginalu <- ifelse(is.na(out$za_jezyk_oryginalu),'',as.character(out$za_jezyk_oryginalu))
out$os_osoba_id <- ifelse(is.na(out$os_osoba_id),'',as.character(out$os_osoba_id))
out$os_nazwisko <- ifelse(is.na(out$os_nazwisko),'',as.character(out$os_nazwisko))
out$os_imie <- ifelse(is.na(out$os_imie),'',as.character(out$os_imie))
out$fo_symbol <- ifelse(is.na(out$fo_symbol),'',as.character(out$fo_symbol))
out$za_opis_wspoltworcow <- ifelse(is.na(out$za_opis_wspoltworcow),'',as.character(out$za_opis_wspoltworcow))
out$za_wydanie <- ifelse(is.na(out$za_wydanie),'',as.character(out$za_wydanie))
out$za_tomy <- ifelse(is.na(out$za_tomy),'',as.character(out$za_tomy))
out$za_instytucja <- ifelse(is.na(out$za_instytucja),'',as.character(out$za_instytucja))
out$wy_wydawnictwo_id <- ifelse(is.na(out$wy_wydawnictwo_id),'',as.character(out$wy_wydawnictwo_id))
out$wy_miejsce <- ifelse(is.na(out$wy_miejsce),'',as.character(out$wy_miejsce))
out$wy_nazwa <- ifelse(is.na(out$wy_nazwa),'',as.character(out$wy_nazwa))
out$za_rok_wydania <- ifelse(is.na(out$za_rok_wydania),'',as.character(out$za_rok_wydania))
out$za_opis_fizyczny_ksiazki <- ifelse(is.na(out$za_opis_fizyczny_ksiazki),'',as.character(out$za_opis_fizyczny_ksiazki))
out$za_seria_wydawnicza <- ifelse(is.na(out$za_seria_wydawnicza),'',as.character(out$za_seria_wydawnicza))
out$tw_nazwisko <- ifelse(is.na(out$tw_nazwisko),'',as.character(out$tw_nazwisko))
out$tw_imie <- ifelse(is.na(out$tw_imie),'',as.character(out$tw_imie))
out$pracownik <- ifelse(is.na(out$pracownik),'',as.character(out$pracownik))
out$za_adnotacje <- ifelse(is.na(out$za_adnotacje),'',as.character(out$za_adnotacje))
out$BN_URL <- ifelse(is.na(out$BN_URL),'',as.character(out$BN_URL))

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same
out$same[1] <- 0
out$dzielone <- paste(out$am_autor_id,out$am_nazwisko,out$am_imie,out$os_osoba_id,out$os_nazwisko,out$os_imie,out$fo_symbol,out$wy_wydawnictwo_id,out$wy_miejsce,out$wy_nazwa,sep = "")

out <- out %>%
  filter(!(same==1&dzielone=="")) %>%
  select(1:33)

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same

#ucięcie zbyt długich ciągów znaków, by weszły do oracle'a
dlugosci <- data.frame(pole = c("am_nazwisko", "am_imie", "za_tytul", "za_tytul_oryginalu", "za_jezyk_oryginalu", "os_nazwisko", "os_imie", "za_opis_wspoltworcow", "za_instytucja", "wy_miejsce", "wy_nazwa", "za_opis_fizyczny_ksiazki", "za_seria_wydawnicza", "tw_nazwisko", "tw_imie", "za_adnotacje"), liczba_znakow = c(50,40,500,500,100,50,40,500,255,40,255,1000,255,200,40,2000))
x <- match(dlugosci$pole,names(out))
for (i in x) {
  progress(match(i,x), max.value = length(x))
  dlugosc <- dlugosci$liczba_znakow[match(names(out[i]),dlugosci$pole)]
  out$za_adnotacje <- ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje!="",paste(out$za_adnotacje,paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),sep = "# "),
                             ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje=="",paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),as.character(out$za_adnotacje)))
  
  out[,i] <- ifelse(dlugosc<nchar(as.character(out[,i])),as.character(substr(out[,i],1,dlugosc)),as.character(out[,i]))
}

out$rekord_BN[out$same == 1] <- ""
out$rz_nazwa[out$same == 1] <- ""
out$za_ro_rok[out$same == 1] <- ""
out$za_type[out$same == 1] <- ""
out$rz_rodzaj_id[out$same == 1] <- ""
out$DZ_NAZWA[out$same == 1] <- ""
out$DZ_DZIAL_ID[out$same == 1] <- ""
out$tw_tworca_id[out$same == 1] <- ""
out$za_tytul[out$same == 1] <- ""
out$za_tytul_oryginalu[out$same == 1] <- ""
out$za_jezyk_oryginalu[out$same == 1] <- ""
out$za_opis_wspoltworcow[out$same == 1] <- ""
out$za_wydanie[out$same == 1] <- ""
out$za_tomy[out$same == 1] <- ""
out$za_instytucja[out$same == 1] <- ""
out$za_rok_wydania[out$same == 1] <- ""
out$za_opis_fizyczny_ksiazki[out$same == 1] <- ""
out$za_seria_wydawnicza[out$same == 1] <- ""
out$tw_nazwisko[out$same == 1] <- ""
out$tw_imie[out$same == 1] <- ""
out$pracownik[out$same == 1] <- ""
out$za_adnotacje[out$same == 1] <- ""
out$BN_URL[out$same == 1] <- ""

out <- out %>%
  select(1:33)

#pętla zapisująca po ok. 2000 wierszy z uwzględnieniem kompletności rekordów bibliograficznych rozpisanych na kilka wierszy
out <- out %>%
  mutate(podzial = ifelse(rekord_BN!="",as.character(rekord_BN),NA)) %>%
  fill(podzial)
ile <- unique(out$podzial)
ile <- split(unique(ile), ceiling(seq_along(unique(ile))/1500))
#aktualizacja - wpisz właściwy rok w ścieżkę pliku
x <- 1:length(ile)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  final <- out %>%
    filter(podzial %in% ile[[i]]) %>%
    select(-podzial)
  write.xlsx(final, paste("C:/Users/Cezary/Desktop/2011_przedmiotowa_do_importu",i,".xlsx",sep = ""),sheetName = "gotowe")
}
bn_ok <- chunk11
data <- bn_ok %>%
  filter(rodzaj_ksiazki=="antologia") %>%
  mutate(redaktor_dzialu = paste(redaktor_dzialu,"_ant",sep = ""))
#uwolnienie kolumn z danymi z bn i przetworzenie do PBL
#1: za_uwagi, rz_nazwa, za_ro_rok, za_type, rz_rodzaj_id, tw_tworca_id, tw_nazwisko, tw_imie, dz_dzial_id, dz_nazwa, redaktor_dzialu
pola_pbl <- data %>%
  select(ZA_UWAGI, RZ_NAZWA, ZA_RO_ROK = rok, RZ_RODZAJ_ID, TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, redaktor_dzialu) %>%
  mutate(ZA_TYPE = "KS")
#2: autor
BN_autor <- data %>%
  select(ZA_UWAGI) %>%
  mutate(AM_AUTOR_ID = NA,
         AM_NAZWISKO = NA,
         AM_IMIE = NA)

#adnotacje z autorów
#w antologii adnotacja musi być wcześniej, żeby na górze było info o tekstach autorów

ZA_ADNOTACJE <- data %>%
  select(X100,X245,ZA_UWAGI)
#pole 100
marc_field_100 <- ZA_ADNOTACJE %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(ZA_ADNOTACJE$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}

#tutaj może być błąd ze względu na brak kolumny $b, wtedy należy zmienić linię z selectem i zakomentować linię: mutate(`$a` = ifelse(!is.na(`$b`),paste(`$a`,`$b`,sep = " "),as.character(`$a`))) %>%
ZA_ADNOTACJE <- marc_field_100 %>%
  #select(ZA_UWAGI,`$a`,`$b`) %>%
  select(ZA_UWAGI,`$a`) %>%
  unique() %>%
  #mutate(`$a` = ifelse(!is.na(`$b`),paste(`$a`,`$b`,sep = " "),as.character(`$a`))) %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  unique() %>%
  mutate(AM_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                              ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
         AM_IMIE = ifelse(grepl("\\|",`$a`),"*",
                          ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE) %>%
  unite("ZA_ADNOTACJE", AM_IMIE:AM_NAZWISKO, sep = " ") %>%
  group_by(ZA_UWAGI) %>%
  mutate(ZA_ADNOTACJE = paste("[Teksty aut.:]",paste(ZA_ADNOTACJE,collapse = ", "),sep = " ")) %>%
  ungroup() %>%
  unique() %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#3: tytuł
#pole 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}

marc_field_245 <- marc_field_245 %>%
 select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
 group_by(ZA_UWAGI) %>%
 mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = " "),
        `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = " "),
        `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = " "),
        `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = " ")) %>%
 ungroup() %>%
 unique() %>%
 unite("ZA_TYTUL",`$a`:`$p`,sep = " ",na.rm = TRUE) %>%
 mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL," +"," "),
        ZA_TYTUL = str_remove(ZA_TYTUL, "\\s+\\/\\s{0,}$"),
        ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                          ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                 ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                        ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
        ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                          ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                 ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                        ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
        ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\.{3} \\.{3}","... "),
        ZA_TYTUL = str_replace_all(ZA_TYTUL," ; ",". "),
        ZA_TYTUL = gsub("( : )(.)",". \\U\\2",perl=TRUE,ZA_TYTUL)) %>%
 select(ZA_UWAGI,ZA_TYTUL)
#dopisanie gatunku do przedmiotowej na podstawie 655 i 650  
gatunki_pbl <- data.frame(gatunek = c("aforyzm", "album", "antologia", "autobiografia", "dziennik", "esej", "felieton", "inne", "kazanie", "list", "miniatura prozą", "opowiadanie", "poemat", "powieść", "proza", "proza poetycka", "reportaż", "rozmyślanie religijne", "rysunek, obraz", "scenariusz", "szkic", "tekst biblijny", "tekst dramatyczny", "dramat", "wiersz", "wspomnienia", "wypowiedź", "pamiętniki", "poezja", "literatura podróżnicza", "satyra", "piosenka"))

#dramat, pamiętniki, poezja, literatura podróżnicza, satyra, piosenka
gatunki_bn <- data %>%
  select(ZA_UWAGI,X655,X650)

gatunki_bn <- sqldf("select *
                    from gatunki_bn
                    left join gatunki_pbl on lower(gatunki_bn.X655) like '%'||gatunki_pbl.gatunek||'%'")
gatunki_bn <- sqldf("select *
                      from gatunki_bn
                      left join gatunki_pbl on lower(gatunki_bn.X650) like '%'||gatunki_pbl.gatunek||'%'")
colnames(gatunki_bn)[5] <- "gatunek2"
gatunki_bn <- gatunki_bn %>%
  mutate(gatunek = ifelse(is.na(gatunek)&!is.na(gatunek2),as.character(gatunek2),as.character(gatunek))) %>%
  filter(!is.na(gatunek)) %>%
  select(ZA_UWAGI,gatunek) %>%
  mutate(gatunek = ifelse(gatunek=="dramat","tekst dramatyczny",
                          ifelse(gatunek=="pamiętniki","wspomnienia",
                                 ifelse(gatunek=="poezja","wiersz",
                                        ifelse(gatunek=="literatura podróżnicza","reportaż",
                                               ifelse(gatunek=="piosenka","wiersz",as.character(gatunek))))))) %>%
  group_by(ZA_UWAGI) %>%
  mutate(gatunek = paste(gatunek,collapse = ", ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(gatunek = gsub("(^.)","\\U\\1",perl = TRUE, gatunek))
#połączenie tytułu z gatunkiem
za_tytul <- marc_field_245 %>%
  left_join(.,gatunki_bn,by="ZA_UWAGI") %>% 
  mutate(gatunek = paste("[",gatunek,"]",sep = ""),
         gatunek = ifelse(gatunek=="[NA]",NA,as.character(gatunek))) %>% 
  unite("ZA_TYTUL", ZA_TYTUL:gatunek, sep = ". ",na.rm=TRUE) %>% 
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\. \\.",". "),
         ZA_TYTUL = str_replace(ZA_TYTUL,"(\\!)(\\.)|(\\?)(\\.)","\\1"))
#4: tytuł oryginału
#pole 246
marc_field_246 <- data %>%
  select(ZA_UWAGI,X246)%>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"~"),
         X246=str_replace_all(X246,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X246",sep = "~",direction = "long") %>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"^\\|")) %>%
  mutate(indicator = str_replace_all(X246,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X246,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_246)[1]))
colnames(empty_table) <-subfield_list
marc_field_246<-cbind(marc_field_246,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_246$X246 <- str_replace(marc_field_246$X246,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_246[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_246$X246),str_replace_all(gsub(string,"\\3",marc_field_246$X246),"\\${2}.", "~"),NA)
}

marc_field_246 <- marc_field_246 %>%
 filter(grepl("oryg",X246)) %>%
 select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
 group_by(ZA_UWAGI) %>%
 mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
        `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = ""),
        `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = ""),
        `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = "")) %>%
 ungroup() %>%
 unique() %>%
 unite("X246",`$a`:`$p`,sep = " ",na.rm = TRUE) %>%
 mutate(X246 = str_replace_all(X246," +"," "),
        X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
        X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                          ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                 ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                        ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
        X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                          ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                 ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                        ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
        X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
        X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
 select(ZA_UWAGI, X246)

#pole 500
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"~"),
         X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
marc_field_500 <- marc_field_500 %>%
  filter(grepl("oryg\\.\\:",X500)) %>%
  mutate(X500 = str_remove(`$a`,"^Tyt\\. oryg\\.: |^Tyt\\, oryg\\.: |^.*?tyt\\. oryg\\.: "),
         X500 = str_remove(X500, "\\s+\\/\\s{0,}$"),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = str_replace_all(X500,"\\.{3} \\.{3}","... "),
         X500 = str_remove(X500, "\\.$"),
         X500 = str_remove(X500,"(,{0,1} {0,1})\\d{4}.*$|(, t|. T)yt. oryg. cyklu:")) %>%
  select(ZA_UWAGI,X500)
#tytuł oryginału
za_tytul_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_246,by="ZA_UWAGI") %>%
  left_join(.,marc_field_500,by="ZA_UWAGI") %>%
  mutate(X500 = ifelse(is.na(X500),NA,
                       ifelse(grepl("oryg",X500),NA,as.character(X500))),
         X500 = ifelse(!is.na(X500)&grepl("\\. - ",X500),str_replace(X500,"(.*?)(\\. - .*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Na książce pseud",X500),str_replace(X500,"(.*?)(\\. Na książce pseud.*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Przekł\\. wg",X500),str_replace(X500,"(.*?)(\\. Przekł\\. wg.*$)","\\1"),as.character(X500)),
         ZA_TYTUL_ORYGINALU = ifelse(is.na(X246)&is.na(X500),NA,
                                     ifelse(!is.na(X500),as.character(X500),as.character(X246))),
         ZA_TYTUL_ORYGINALU = str_remove_all(ZA_TYTUL_ORYGINALU,'\\"')) %>%
  select(ZA_UWAGI,ZA_TYTUL_ORYGINALU)

#5: język oryginału
marc_field_041 <- data %>%
  select(ZA_UWAGI,X041)%>%
  filter(X041!="") %>%
  mutate(X041=str_replace_all(X041,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X041",sep = "~",direction = "long") %>%
  filter(X041!="") %>%
  mutate(X041=str_remove_all(X041,"^\\|")) %>%
  mutate(indicator = str_replace_all(X041,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X041,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_041)[1]))
colnames(empty_table) <-subfield_list
marc_field_041<-cbind(marc_field_041,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_041$X041 <- str_replace(marc_field_041$X041,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_041[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_041$X041),str_replace_all(gsub(string,"\\3",marc_field_041$X041),"\\${2}.", "~"),NA)
}
za_jezyk_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_041 %>% select(ZA_UWAGI,ZA_JEZYK_ORYGINALU = `$a`),by="ZA_UWAGI") %>%
  mutate(ZA_JEZYK_ORYGINALU = str_replace_all(ZA_JEZYK_ORYGINALU,"\\$a",",")) %>%
  unique()

#6: współtwórcy
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}

BN_wspoltworca <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         ws_prosty = str_replace_all(str_to_lower(osoba), "\\W", ""),
         fu_prosta = str_replace_all(str_to_lower(funkcja), "\\W", "")) %>%
  left_join(.,PBL_wspoltworcy %>% select(OS_OSOBA_ID,OS_LICZBA_ZAPISOW,nazwa_prosta),by=c("ws_prosty"="nazwa_prosta")) %>%
  arrange(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,-OS_LICZBA_ZAPISOW)
BN_wspoltworca$id_grupy <- cumsum(!duplicated(BN_wspoltworca[1:2]))
BN_wspoltworca <- BN_wspoltworca[!duplicated(BN_wspoltworca$id_grupy),] %>%
  left_join(.,PBL_funkcje,by=c("fu_prosta"="nazwa")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL",NA,as.character(fo_symbol))) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja)

#tutaj przeszukać X245 i znaleźć błędy współtwórców
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`)

BN_wspoltworca <- BN_wspoltworca %>%
  left_join(.,marc_field_245,by="ZA_UWAGI")

x <- 1:lengths(BN_wspoltworca[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_wspoltworca$czy_nazwisko[i] <- str_detect(BN_wspoltworca$X245c[i],BN_wspoltworca$OS_NAZWISKO[i])
  BN_wspoltworca$czy_imie[i] <- grepl(BN_wspoltworca$OS_IMIE[i],BN_wspoltworca$X245c[i])
}

BN_wspoltworca <- BN_wspoltworca %>%
  mutate(ZA_ADNOTACJE = ifelse(czy_nazwisko==FALSE|czy_imie==FALSE,paste("UWAGA! Konflikt w danych osobowych w polach 700 i 245. Porównaj pola współtórców w formularzu z polem BN: ",X245c,sep = ""),NA)) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja,ZA_ADNOTACJE)

#7: opis współtwórców
opis_wspoltworcow <- BN_wspoltworca %>%
  select(ZA_UWAGI,funkcja,OS_IMIE,OS_NAZWISKO) %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  filter(!is.na(OS_NAZWISKO)|(is.na(OS_NAZWISKO)&grepl("et al\\.",X245c))) %>%
  mutate(jest_et_al = grepl("et al\\.",X245c),
         OS_IMIE = ifelse(OS_IMIE=="*","",as.character(OS_IMIE)),
         opis = ifelse(!is.na(OS_NAZWISKO),paste(funkcja,OS_IMIE, OS_NAZWISKO, sep = " "),""),
         opis = str_replace_all(opis," +"," "),
         opis = ifelse(opis==" ","",as.character(opis))) %>%
  select(ZA_UWAGI,opis,jest_et_al) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ", "),
         jest_et_al = paste(unique(jest_et_al),sep = "")) %>%
  ungroup() %>%
  unique() %>%
  mutate(opis = ifelse(jest_et_al==TRUE&opis=="","et al.",
                       ifelse(jest_et_al,paste(opis,"et al.",sep = " "),opis))) %>%
  select(ZA_UWAGI,opis)

#700
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
marc_field_700 <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         funkcja_duza = str_to_lower(funkcja),
         opis = paste(funkcja_duza,OS_IMIE,OS_NAZWISKO, sep = " "),
         opis_duzy = paste(funkcja,OS_IMIE,OS_NAZWISKO, sep = " ")) %>%
  select(ZA_UWAGI,opis,opis_duzy) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ". "),
         opis_duzy = paste(opis_duzy,collapse = ". ")) %>%
  ungroup() %>%
  unique()

#opis współtwórców ze strefy odpowiedzialności 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$c`)

#porównanie opisu współtwórców z 245 i 700
wspoltworcy <- marc_field_700 %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  cSplit(.,"$c",sep = " ; ",direction = "long") %>%
  #ograniczanie osób ze strefy odpowiedzialności
  mutate(czy_mala = grepl(" [a-zęóąśłżźćń]|^[a-zęóąśłżźćń]|\\[[a-zęóąśłżźćń]",`$c`,ignore.case = FALSE)) %>%
  filter(czy_mala==TRUE) %>%
  select(-czy_mala) %>%
  #mutate(`$c` = gsub("^(\\[){0,1}([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])","\\1\\U\\2",perl = TRUE,`$c`)) %>%
  group_by(ZA_UWAGI) %>%
  mutate(X245 = paste(`$c`, collapse = ", ")) %>%
  select(-`$c`) %>%
  unique() %>%
  mutate(order_pbl = as.character(str_extract_all(opis,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_pbl = str_replace_all(order_pbl,"(.*?\")(.)(\".*?.)", "\\2"),
         order_bn = as.character(str_extract_all(X245,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_bn = str_replace_all(order_bn,"(.*?\")(.)(\".*?.)", "\\2"),
         X245 = str_remove(X245, "\\.$"),
         X245 = str_remove(X245, "\\["),
         X245 = str_remove(X245, "\\]"),
         order_pbl = str_remove_all(order_pbl, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         order_bn = str_remove_all(order_bn, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         to_samo = order_pbl==order_bn,
         X245 = gsub("(^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(.*)","\\U\\1\\E\\2",perl = TRUE, X245)) %>%
  left_join(.,za_jezyk_oryginalu,by="ZA_UWAGI") %>%
  mutate(czy_pl = grepl("pol",ZA_JEZYK_ORYGINALU)|is.na(ZA_JEZYK_ORYGINALU),
         decyzja = ifelse(to_samo==FALSE|czy_pl==FALSE,FALSE,TRUE))

za_opis_wspoltworcow <- wspoltworcy %>%
  mutate(za_opis_wspoltworcow = ifelse(decyzja==TRUE,as.character(X245),paste(X245,opis_duzy,sep = "#"))) %>%
  select(ZA_UWAGI,opis_duzy,za_opis_wspoltworcow) %>%
  cSplit(.,"za_opis_wspoltworcow",sep = "#",direction = "wide") %>%
  mutate(za_opis_wspoltworcow_2 = ifelse(is.na(za_opis_wspoltworcow_2),'',as.character(za_opis_wspoltworcow_2)),
         to_samo = za_opis_wspoltworcow_1==za_opis_wspoltworcow_2) %>%
  filter(to_samo==FALSE) %>%
  group_by(ZA_UWAGI) %>%
  mutate(za_opis_wspoltworcow = paste(za_opis_wspoltworcow_1,za_opis_wspoltworcow_2,sep = "#"),
         za_opis_wspoltworcow = str_remove_all(za_opis_wspoltworcow,"\\#$")) %>%
  select(ZA_UWAGI,za_opis_wspoltworcow)

opis_wspoltworcow <- opis_wspoltworcow %>%
  filter(ZA_UWAGI %notin% za_opis_wspoltworcow$ZA_UWAGI) %>%
  filter(!is.na(opis)) %>%
  rename(za_opis_wspoltworcow = opis)

za_opis_wspoltworcow <- za_opis_wspoltworcow %>%
  bind_rows(.,opis_wspoltworcow) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#8 wydanie
marc_field_250 <- data %>%
  select(ZA_UWAGI,X250)%>%
  filter(X250!="") %>%
  mutate(X250=str_replace_all(X250,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X250",sep = "~",direction = "long") %>%
  filter(X250!="") %>%
  mutate(X250=str_remove_all(X250,"^\\|")) %>%
  mutate(indicator = str_replace_all(X250,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X250,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_250)[1]))
colnames(empty_table) <-subfield_list
marc_field_250<-cbind(marc_field_250,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_250$X250 <- str_replace(marc_field_250$X250,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_250[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_250$X250),str_replace_all(gsub(string,"\\3",marc_field_250$X250),"\\${2}.", "~"),NA)
}

za_wydanie <- marc_field_250 %>%
  select(ZA_UWAGI, wydanie = `$a`) %>%
  mutate(wydanie = str_remove(wydanie," \\/$")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#9: instytucja sprawcza
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}

za_instytucja <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`) %>%
  filter(!is.na(X245c)) %>%
  mutate(instytucja = ifelse(grepl("\\;",X245c),str_replace_all(X245c, "(.*?)(\\;(?!.*\\;))( )+(.*?$)","\\4"),"")) %>%
  left_join(.,BN_wspoltworca,by="ZA_UWAGI")

x <- 1:lengths(za_instytucja[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  za_instytucja$czy_nazwisko[i] <- grepl(za_instytucja$OS_NAZWISKO[i],za_instytucja$X245c[i])
  za_instytucja$czy_imie[i] <- grepl(za_instytucja$OS_IMIE[i],za_instytucja$X245c[i])
}

za_instytucja <- za_instytucja %>%
  filter(is.na(czy_nazwisko)&is.na(czy_imie)) %>%
  filter(instytucja!="") %>%
  filter(!grepl("^\\[[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]|^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]",instytucja)) %>%
  mutate(instytucja = str_remove(instytucja,"\\.$")) %>%
  select(ZA_UWAGI,instytucja) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#10: wydawnictwo
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI, X260) %>%
  mutate(X260 = str_replace_all(X260,"s\\.n\\.", "b.w."), 
         X260 = str_replace_all(X260,"s\\.l\\.", "b.m."), 
         X260 = str_replace_all(X260,"S\\.l\\.", "b.m."), 
         X260 = str_remove(X260,"^\\\\+"), 
         rok_wydania = str_extract_all(X260, "(?<=\\$c).*(?=\\$e)|(?<=\\$c).*"), 
         bez_roku = str_replace_all(X260, ".\\$c.*", ""), 
         ile_wydawnictw = str_count(bez_roku, "\\$b"),
         ile_miejsc = str_count(bez_roku, "\\$a"),
         kolejnosc = str_replace_all(as.character(str_extract_all(bez_roku, "\\$.")), "[^a-z]", ""),
         bez_roku = str_replace_all(bez_roku, ";\\$b", ":$b"),
         wydaw_podziel = ifelse(ile_wydawnictw>ile_miejsc|kolejnosc=="caabb", str_replace_all(bez_roku, "(\\$a)(.*?)( :\\$b.*?)( :\\$b)", "\\1\\2\\3 ;$a\\2\\4"),bez_roku),
         wydawnictwo_test = str_replace_all(wydaw_podziel, "(\\$b)(.*?)( ;\\$a)", "\\1\\2|\\3")) %>%
  select(ZA_UWAGI,rok_wydania,wydawnictwo_test) %>%
  cSplit(., "wydawnictwo_test", sep = "|", direction = "long") %>%
  mutate(wydawnictwo = str_extract_all(wydawnictwo_test, "(?<=\\$b)(.*)"),
         miejsce_wydania = str_replace_all(str_extract_all(wydawnictwo_test, "(?<=\\$a)(.*)(?= {0,1}: {0,1}\\$b)|(?<=\\$a)(.*)($)")," ;\\$a", ", "),
         nazwa_prosta = str_to_lower(str_replace_all(str_replace_all(unlist(wydawnictwo_test), "\\$\\w", ""), "\\W", ""))) %>%
  left_join(.,PBL_wydawnictwa,by="nazwa_prosta") %>%
  mutate(to_samo = wydawnictwo==WY_NAZWA) %>%
  arrange(ZA_UWAGI,-to_samo,-WY_LICZBA_ZAPISOW)
BN_wydawnictwo$id_grupy <- cumsum(!duplicated(BN_wydawnictwo[1:3]))
BN_wydawnictwo <- BN_wydawnictwo[!duplicated(BN_wydawnictwo$id_grupy),] %>%
  mutate(WY_NAZWA = ifelse(!is.na(WY_NAZWA),as.character(WY_NAZWA),as.character(wydawnictwo)),
         WY_MIASTO = ifelse(!is.na(WY_MIASTO),as.character(WY_MIASTO),as.character(miejsce_wydania)),
         rok_wydania = str_replace_all(rok_wydania, "(.*)(\\.)", "\\1"),
         za_rok_wydania = ifelse(nchar(rok_wydania)==4,as.character(rok_wydania),NA),
         do_opisu = ifelse(is.na(za_rok_wydania),paste("[",str_extract(rok_wydania,"\\d{4}"),"]",sep = ""),""),
         WY_MIASTO = ifelse(substr(WY_MIASTO,1,1)=="["&substr(WY_MIASTO,nchar(WY_MIASTO),nchar(WY_MIASTO))!="]"&is.na(WY_WYDAWNICTWO_ID),paste(trim(WY_MIASTO),"]",sep = ""),as.character(WY_MIASTO))) %>%
  select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania,do_opisu)

#11: opis fizyczny książki
#pole 300 do opisu fizycznego
marc_field_300 <- data %>%
  select(ZA_UWAGI,X300)%>%
  filter(X300!="") %>%
  mutate(X300=str_replace_all(X300,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X300",sep = "~",direction = "long") %>%
  filter(X300!="") %>%
  mutate(X300=str_remove_all(X300,"^\\|")) %>%
  mutate(indicator = str_replace_all(X300,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X300,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_300)[1]))
colnames(empty_table) <-subfield_list
marc_field_300<-cbind(marc_field_300,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_300$X300 <- str_replace(marc_field_300$X300,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_300[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_300$X300),str_replace_all(gsub(string,"\\3",marc_field_300$X300),"\\${2}.", "~"),NA)
}
marc_field_300 <- marc_field_300 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$b` = str_remove(`$b`," \\;+$| \\:+$"),
         `$e` = ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`)&grepl("\\+ dysk|płyt",`$e`),str_extract(`$e`,"(?<=\\+)(dysk|płyt.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),
                       ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`),str_extract(`$e`,"(^.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),NA)),
         `$a` = ifelse(is.na(`$a`),"",as.character(`$a`)),
         `$b` = ifelse(is.na(`$b`),"",as.character(`$b`)),
         `$e` = ifelse(is.na(`$e`),"",as.character(`$e`)))
#pole 500 do opisu fizycznego
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
marc_field_500 <- marc_field_500 %>%
  mutate(`$a` = ifelse(grepl("oryg(\\.|\\,)",X500)&grepl("pseud|nazwa",X500,ignore.case = TRUE),str_replace(`$a`,"(^.*?)(\\. )(\\p{Lu}.*$)","\\3"),as.character(`$a`))) %>% 
  filter(!grepl("oryg(\\.|\\,)",`$a`)&grepl("pseud|nazwa|dotycz|pol",`$a`,ignore.case = TRUE)) %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))
  
#pole 546 do opisu fizycznego
marc_field_546 <- data %>%
  select(ZA_UWAGI,X546)%>%
  filter(X546!="") %>%
  mutate(X546=str_replace_all(X546,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X546",sep = "~",direction = "long") %>%
  filter(X546!="") %>%
  mutate(X546=str_remove_all(X546,"^\\|")) %>%
  mutate(indicator = str_replace_all(X546,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X546,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_546)[1]))
colnames(empty_table) <-subfield_list
marc_field_546<-cbind(marc_field_546,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_546$X546 <- str_replace(marc_field_546$X546,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_546[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_546$X546),str_replace_all(gsub(string,"\\3",marc_field_546$X546),"\\${2}.", "~"),NA)
}
marc_field_546 <- marc_field_546 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))

za_opis_ks <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,do_opisu),by="ZA_UWAGI") %>%
  left_join(.,marc_field_300 %>% select(ZA_UWAGI,X300a=`$a`,X300b=`$b`,X300e=`$e`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_500 %>% select(ZA_UWAGI,X500a=`$a`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_546 %>% select(ZA_UWAGI,X546a=`$a`),by="ZA_UWAGI")
za_opis_ks[is.na(za_opis_ks)]  <- ""
za_opis_ks <- za_opis_ks %>%
  mutate(za_opis_ks = paste(ifelse(do_opisu!="",paste(as.character(do_opisu),", ",sep = ""),""),ifelse(X300a!="",paste(as.character(X300a),", ",sep = ""),""),ifelse(X300b!="",paste(as.character(X300b),", ",sep = ""),""),ifelse(X300e!="",paste(as.character(X300e),", ",sep = ""),""),ifelse(X500a!="",paste(as.character(X500a),", ",sep = ""),""),ifelse(X546a!="",as.character(X546a),""),sep = ""),
         za_opis_ks = str_remove(za_opis_ks,"(, )+$")) %>%
  select(ZA_UWAGI,za_opis_ks) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(za_opis_ks))
za_opis_ks$id_grupy <- cumsum(!duplicated(za_opis_ks[1]))
za_opis_ks <- za_opis_ks[!duplicated(za_opis_ks$id_grupy),] %>%
  select(-id_grupy)

#12: seria wydawnicza
marc_field_490 <- data %>%
  select(ZA_UWAGI,X490,X800,X830) %>%
  mutate(X490 = ifelse(grepl("U\\+",X490),as.character(X830),as.character(X490))) %>%
  mutate(X800 = ifelse(X490!="","",as.character(X800)),
         X830 = ifelse(X490!="","",as.character(X830)),
         X800 = str_replace(X800,"(\\$a)(.*)(\\$t)","\\1"),
         X490 = ifelse(X490==""&X830!="",as.character(X830),
                       ifelse(X490==""&X800!="",as.character(X800),as.character(X490)))) %>%
  select(ZA_UWAGI,X490) %>%
  filter(X490!="") %>%
  mutate(X490=str_replace_all(X490,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X490",sep = "~",direction = "long") %>%
  filter(X490!="") %>%
  mutate(X490=str_remove_all(X490,"^\\|")) %>%
  mutate(indicator = str_replace_all(X490,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X490,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_490)[1]))
colnames(empty_table) <-subfield_list
marc_field_490<-cbind(marc_field_490,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_490$X490 <- str_replace(marc_field_490$X490,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_490[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_490$X490),str_replace_all(gsub(string,"\\3",marc_field_490$X490),"\\${2}.", "~"),NA)
}
za_seria_wydawnicza <- marc_field_490 %>%
  mutate(`$a` = str_replace_all(`$a`,"(=)(\\$a)","\\1 "),
         `$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$v` = ifelse(is.na(`$v`),"",as.character(`$v`))) %>%
  filter(!is.na(`$a`)) %>%
  mutate(seria = str_remove(paste("(",`$a`,"; ",`$v`,")",sep = ""),"; (?=\\)$)"),
         seria = gsub("( : )(.)",". \\U\\2",perl=TRUE,seria)) %>%
  select(ZA_UWAGI,seria) %>%
  group_by(ZA_UWAGI) %>%
  mutate(seria = paste(seria,collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(seria = str_replace_all(seria,"\\$.","; ")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#13: tomy
za_tomy <- data %>%
  select(ZA_UWAGI) %>%
  mutate(za_tomy = NA)

#14: adnotacje
za_adnotacje <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,ZA_ADNOTACJE %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  mutate(ZA_ADNOTACJE = paste(ifelse(is.na(ZA_ADNOTACJE.x),"",paste(as.character(ZA_ADNOTACJE.x),"# ",sep = "")),ifelse(is.na(ZA_ADNOTACJE.y),"",as.character(ZA_ADNOTACJE.y)),sep = ""),
         ZA_ADNOTACJE = str_remove(ZA_ADNOTACJE,"(# )+$")) %>%
  select(ZA_UWAGI,ZA_ADNOTACJE) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(ZA_ADNOTACJE))
za_adnotacje$id_grupy <- cumsum(!duplicated(za_adnotacje[1]))
za_adnotacje <- za_adnotacje[!duplicated(za_adnotacje$id_grupy),] %>%
  select(-id_grupy)

#15: BN_URL
BN_URL <- data %>%
  select(ZA_UWAGI,BN_URL)

#wyrównanie liczby wierszy do liczby wierszy obiektu data
BN_wspoltworca <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,OS_OSOBA_ID,OS_NAZWISKO,OS_IMIE,fo_symbol),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, OS_OSOBA_ID = paste(OS_OSOBA_ID, collapse="|"), OS_NAZWISKO = paste(OS_NAZWISKO, collapse="|"), OS_IMIE = paste(OS_IMIE, collapse="|"), fo_symbol = paste(fo_symbol, collapse="|")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL","NA",as.character(fo_symbol)))
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, WY_WYDAWNICTWO_ID = paste(WY_WYDAWNICTWO_ID, collapse="|"), WY_NAZWA = paste(WY_NAZWA, collapse="|"), WY_MIASTO = paste(WY_MIASTO, collapse="|"), za_rok_wydania = paste(unique(za_rok_wydania), collapse="|")) %>%
  mutate(za_rok_wydania = ifelse(za_rok_wydania=="NA","",as.integer(za_rok_wydania)))

#połączenie wszystkich elementów w jedną tabelę
kolejnosc <- data.frame(kolejnosc=c("ZA_UWAGI","RZ_NAZWA","ZA_RO_ROK","ZA_TYPE","RZ_RODZAJ_ID","DZ_NAZWA","DZ_DZIAL_ID","TW_TWORCA_ID","AM_AUTOR_ID","AM_NAZWISKO","AM_IMIE","ZA_TYTUL","ZA_TYTUL_ORYGINALU","ZA_JEZYK_ORYGINALU","OS_OSOBA_ID","OS_NAZWISKO","OS_IMIE","fo_symbol","za_opis_wspoltworcow","wydanie","za_tomy","instytucja","WY_WYDAWNICTWO_ID","WY_MIASTO","WY_NAZWA","za_rok_wydania","za_opis_ks","seria","TW_NAZWISKO","TW_IMIE","redaktor_dzialu","ZA_ADNOTACJE","BN_URL"))
polaczone <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,pola_pbl,by = "ZA_UWAGI") %>%
  left_join(.,BN_autor,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,za_jezyk_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_wspoltworcow,by = "ZA_UWAGI") %>%
  left_join(.,za_wydanie,by = "ZA_UWAGI") %>%
  left_join(.,za_instytucja,by = "ZA_UWAGI") %>%
  left_join(.,BN_wydawnictwo,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_ks,by = "ZA_UWAGI") %>%
  left_join(.,za_seria_wydawnicza,by = "ZA_UWAGI") %>%
  left_join(.,za_tomy,by = "ZA_UWAGI") %>%
  left_join(.,za_adnotacje,by = "ZA_UWAGI") %>%
  left_join(.,BN_URL,by = "ZA_UWAGI") %>%
  select(as.vector(kolejnosc$kolejnosc))
colnames(polaczone) <- c("rekord_BN","rz_nazwa","za_ro_rok","za_type","rz_rodzaj_id","DZ_NAZWA","DZ_DZIAL_ID","tw_tworca_id","am_autor_id","am_nazwisko","am_imie","za_tytul","za_tytul_oryginalu","za_jezyk_oryginalu","os_osoba_id","os_nazwisko","os_imie","fo_symbol","za_opis_wspoltworcow","za_wydanie","za_tomy","za_instytucja","wy_wydawnictwo_id","wy_miejsce","wy_nazwa","za_rok_wydania","za_opis_fizyczny_ksiazki","za_seria_wydawnicza","tw_nazwisko","tw_imie","pracownik","za_adnotacje","BN_URL")

#zasygnalizowanie niepoprawnego kodowania
x <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("<U\\+(....)>",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)!=0,paste(polaczone$za_adnotacje,paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole",sep = ""),sep = "# "),paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole",sep = "")),as.character(polaczone$za_adnotacje))
  polaczone[,i] <- gsub("<U\\+(....)>", "???", polaczone[,i])
}
#zasygnalizowanie obecności znaku $ w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("\\$",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
#zasygnalizowanie obecności frazy "character(0)" w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("character\\(0\\)",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
#zasygnalizowanie obecności znaku # w opisie współtwórców
polaczone$za_adnotacje <- ifelse(grepl("\\#",polaczone$za_opis_wspoltworcow),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności \"#\" współtwórcy z pola 700)",paste(polaczone$za_adnotacje,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności # współtwórcy z pola 700)",sep = "# ")),as.character(polaczone$za_adnotacje))

out <- cSplit(polaczone, c("am_autor_id", "am_nazwisko", "am_imie","os_osoba_id","os_nazwisko", "os_imie", "fo_symbol","wy_wydawnictwo_id","wy_miejsce","wy_nazwa"),sep = "|",direction = "long") %>%
  unique()

out$rekord_BN <- ifelse(is.na(out$rekord_BN),'',as.character(out$rekord_BN))
out$rz_nazwa <- ifelse(is.na(out$rz_nazwa),'',as.character(out$rz_nazwa))
out$za_ro_rok <- ifelse(is.na(out$za_ro_rok),'',as.character(out$za_ro_rok))
out$za_type <- ifelse(is.na(out$za_type),'',as.character(out$za_type))
out$rz_rodzaj_id <- ifelse(is.na(out$rz_rodzaj_id),'',as.character(out$rz_rodzaj_id))
out$DZ_NAZWA <- ifelse(is.na(out$DZ_NAZWA),'',as.character(out$DZ_NAZWA))
out$DZ_DZIAL_ID <- ifelse(is.na(out$DZ_DZIAL_ID),'',as.character(out$DZ_DZIAL_ID))
out$tw_tworca_id <- ifelse(is.na(out$tw_tworca_id),'',as.character(out$tw_tworca_id))
out$am_autor_id <- ifelse(is.na(out$am_autor_id),'',as.character(out$am_autor_id))
out$am_nazwisko <- ifelse(is.na(out$am_nazwisko),'',as.character(out$am_nazwisko))
out$am_imie <- ifelse(is.na(out$am_imie),'',as.character(out$am_imie))
out$za_tytul <- ifelse(is.na(out$za_tytul),'',as.character(out$za_tytul))
out$za_tytul_oryginalu <- ifelse(is.na(out$za_tytul_oryginalu),'',as.character(out$za_tytul_oryginalu))
out$za_jezyk_oryginalu <- ifelse(is.na(out$za_jezyk_oryginalu),'',as.character(out$za_jezyk_oryginalu))
out$os_osoba_id <- ifelse(is.na(out$os_osoba_id),'',as.character(out$os_osoba_id))
out$os_nazwisko <- ifelse(is.na(out$os_nazwisko),'',as.character(out$os_nazwisko))
out$os_imie <- ifelse(is.na(out$os_imie),'',as.character(out$os_imie))
out$fo_symbol <- ifelse(is.na(out$fo_symbol),'',as.character(out$fo_symbol))
out$za_opis_wspoltworcow <- ifelse(is.na(out$za_opis_wspoltworcow),'',as.character(out$za_opis_wspoltworcow))
out$za_wydanie <- ifelse(is.na(out$za_wydanie),'',as.character(out$za_wydanie))
out$za_tomy <- ifelse(is.na(out$za_tomy),'',as.character(out$za_tomy))
out$za_instytucja <- ifelse(is.na(out$za_instytucja),'',as.character(out$za_instytucja))
out$wy_wydawnictwo_id <- ifelse(is.na(out$wy_wydawnictwo_id),'',as.character(out$wy_wydawnictwo_id))
out$wy_miejsce <- ifelse(is.na(out$wy_miejsce),'',as.character(out$wy_miejsce))
out$wy_nazwa <- ifelse(is.na(out$wy_nazwa),'',as.character(out$wy_nazwa))
out$za_rok_wydania <- ifelse(is.na(out$za_rok_wydania),'',as.character(out$za_rok_wydania))
out$za_opis_fizyczny_ksiazki <- ifelse(is.na(out$za_opis_fizyczny_ksiazki),'',as.character(out$za_opis_fizyczny_ksiazki))
out$za_seria_wydawnicza <- ifelse(is.na(out$za_seria_wydawnicza),'',as.character(out$za_seria_wydawnicza))
out$tw_nazwisko <- ifelse(is.na(out$tw_nazwisko),'',as.character(out$tw_nazwisko))
out$tw_imie <- ifelse(is.na(out$tw_imie),'',as.character(out$tw_imie))
out$pracownik <- ifelse(is.na(out$pracownik),'',as.character(out$pracownik))
out$za_adnotacje <- ifelse(is.na(out$za_adnotacje),'',as.character(out$za_adnotacje))
out$BN_URL <- ifelse(is.na(out$BN_URL),'',as.character(out$BN_URL))

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same
out$same[1] <- 0
out$dzielone <- paste(out$am_autor_id,out$am_nazwisko,out$am_imie,out$os_osoba_id,out$os_nazwisko,out$os_imie,out$fo_symbol,out$wy_wydawnictwo_id,out$wy_miejsce,out$wy_nazwa,sep = "")

out <- out %>%
  filter(!(same==1&dzielone=="")) %>%
  select(1:33)

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same

#ucięcie zbyt długich ciągów znaków, by weszły do oracle'a
dlugosci <- data.frame(pole = c("am_nazwisko", "am_imie", "za_tytul", "za_tytul_oryginalu", "za_jezyk_oryginalu", "os_nazwisko", "os_imie", "za_opis_wspoltworcow", "za_instytucja", "wy_miejsce", "wy_nazwa", "za_opis_fizyczny_ksiazki", "za_seria_wydawnicza", "tw_nazwisko", "tw_imie", "za_adnotacje"), liczba_znakow = c(50,40,500,500,100,50,40,500,255,40,255,1000,255,200,40,2000))
x <- match(dlugosci$pole,names(out))
for (i in x) {
  progress(match(i,x), max.value = length(x))
  dlugosc <- dlugosci$liczba_znakow[match(names(out[i]),dlugosci$pole)]
  out$za_adnotacje <- ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje!="",paste(out$za_adnotacje,paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),sep = "# "),
                             ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje=="",paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),as.character(out$za_adnotacje)))
  
  out[,i] <- ifelse(dlugosc<nchar(as.character(out[,i])),as.character(substr(out[,i],1,dlugosc)),as.character(out[,i]))
}

out$rekord_BN[out$same == 1] <- ""
out$rz_nazwa[out$same == 1] <- ""
out$za_ro_rok[out$same == 1] <- ""
out$za_type[out$same == 1] <- ""
out$rz_rodzaj_id[out$same == 1] <- ""
out$DZ_NAZWA[out$same == 1] <- ""
out$DZ_DZIAL_ID[out$same == 1] <- ""
out$tw_tworca_id[out$same == 1] <- ""
out$za_tytul[out$same == 1] <- ""
out$za_tytul_oryginalu[out$same == 1] <- ""
out$za_jezyk_oryginalu[out$same == 1] <- ""
out$za_opis_wspoltworcow[out$same == 1] <- ""
out$za_wydanie[out$same == 1] <- ""
out$za_tomy[out$same == 1] <- ""
out$za_instytucja[out$same == 1] <- ""
out$za_rok_wydania[out$same == 1] <- ""
out$za_opis_fizyczny_ksiazki[out$same == 1] <- ""
out$za_seria_wydawnicza[out$same == 1] <- ""
out$tw_nazwisko[out$same == 1] <- ""
out$tw_imie[out$same == 1] <- ""
out$pracownik[out$same == 1] <- ""
out$za_adnotacje[out$same == 1] <- ""
out$BN_URL[out$same == 1] <- ""

out <- out %>%
  select(1:33)

#pętla zapisująca po ok. 2000 wierszy z uwzględnieniem kompletności rekordów bibliograficznych rozpisanych na kilka wierszy
out <- out %>%
  mutate(podzial = ifelse(rekord_BN!="",as.character(rekord_BN),NA)) %>%
  fill(podzial)
ile <- unique(out$podzial)
ile <- split(unique(ile), ceiling(seq_along(unique(ile))/1500))
#aktualizacja - wpisz właściwy rok w ścieżkę pliku
x <- 1:length(ile)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  final <- out %>%
    filter(podzial %in% ile[[i]]) %>%
    select(-podzial)
  write.xlsx(final, paste("C:/Users/Cezary/Desktop/2011_antologie_do_importu",i,".xlsx",sep = ""),sheetName = "gotowe")
}
bn_ok <- chunk11
data <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie") %>%
  mutate(redaktor_dzialu = paste(redaktor_dzialu,"_wsp",sep = ""))

#uwolnienie kolumn z danymi z bn i przetworzenie do PBL
#1: za_uwagi, rz_nazwa, za_ro_rok, za_type, rz_rodzaj_id, tw_tworca_id, tw_nazwisko, tw_imie, dz_dzial_id, dz_nazwa, redaktor_dzialu
pola_pbl <- data %>%
  select(ZA_UWAGI, RZ_NAZWA, ZA_RO_ROK = rok, RZ_RODZAJ_ID, TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, redaktor_dzialu) %>%
  mutate(ZA_TYPE = "KS")

#2: autor
BN_autor <- data %>% 
  select(ZA_UWAGI,X245) %>% 
  mutate(X245 = str_extract(X245, "(?<=\\/\\$c)(.*?)(?= ;|$)"),
         X245 = str_remove(X245,"\\.$"),
         X245 = str_remove(X245,"\\["),
         X245 = str_remove(X245,"\\]"),
         AM_NAZWISKO = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),as.character(X245),str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\3")),
         AM_IMIE = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),"*",str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\1")),
         nazwa = str_replace_all(str_to_lower(paste(AM_NAZWISKO,AM_IMIE, sep = "")), "\\W", "")) %>%
  left_join(.,PBL_autorzy %>% select(AM_AUTOR_ID,AM_KRYPTONIM,AM_LICZBA_ZAPISOW,nazwa) %>% filter(is.na(AM_KRYPTONIM)),by="nazwa") %>%
  arrange(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,-AM_LICZBA_ZAPISOW)
BN_autor$id_grupy <- cumsum(!duplicated(BN_autor[1:4]))
BN_autor <- BN_autor[!duplicated(BN_autor$id_grupy),] %>%
  mutate(ZA_ADNOTACJE = NA) %>% 
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,ZA_ADNOTACJE,AM_AUTOR_ID)

#3: tytuł
#pole 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
if("$n" %in% colnames(marc_field_245)) {
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = " "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = " "),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = " "),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  unite("ZA_TYTUL",`$a`:`$p`,sep = " ",na.rm = TRUE) %>% 
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL," +"," "),
         ZA_TYTUL = str_remove(ZA_TYTUL, "\\s+\\/\\s{0,}$"),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\.{3} \\.{3}","... "),
         ZA_TYTUL = str_replace_all(ZA_TYTUL," ; ",". "),
         ZA_TYTUL = gsub("( : )(.)",". \\U\\2",perl=TRUE,ZA_TYTUL)) %>%
  select(ZA_UWAGI,ZA_TYTUL)
} else {
  marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$a`,`$b`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = " "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  unite("ZA_TYTUL",`$a`:`$b`,sep = " ",na.rm = TRUE) %>% 
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL," +"," "),
         ZA_TYTUL = str_remove(ZA_TYTUL, "\\s+\\/\\s{0,}$"),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\.{3} \\.{3}","... "),
         ZA_TYTUL = str_replace_all(ZA_TYTUL," ; ",". "),
         ZA_TYTUL = gsub("( : )(.)",". \\U\\2",perl=TRUE,ZA_TYTUL)) %>%
  select(ZA_UWAGI,ZA_TYTUL)
}
tytul_wspolwydanie <- marc_field_245
#dopisanie gatunku do przedmiotowej na podstawie 655 i 650  
gatunki_pbl <- data.frame(gatunek = c("aforyzm", "album", "antologia", "autobiografia", "dziennik", "esej", "felieton", "inne", "kazanie", "list", "miniatura prozą", "opowiadanie", "poemat", "powieść", "proza", "proza poetycka", "reportaż", "rozmyślanie religijne", "rysunek, obraz", "scenariusz", "szkic", "tekst biblijny", "tekst dramatyczny", "dramat", "wiersz", "wspomnienia", "wypowiedź", "pamiętniki", "poezja", "literatura podróżnicza", "satyra", "piosenka"))

#dramat, pamiętniki, poezja, literatura podróżnicza, satyra, piosenka
gatunki_bn <- data %>%
  select(ZA_UWAGI,X655,X650)

gatunki_bn <- sqldf("select *
                    from gatunki_bn
                    left join gatunki_pbl on lower(gatunki_bn.X655) like '%'||gatunki_pbl.gatunek||'%'")
gatunki_bn <- sqldf("select *
                      from gatunki_bn
                      left join gatunki_pbl on lower(gatunki_bn.X650) like '%'||gatunki_pbl.gatunek||'%'")
colnames(gatunki_bn)[5] <- "gatunek2"
gatunki_bn <- gatunki_bn %>%
  mutate(gatunek = ifelse(is.na(gatunek)&!is.na(gatunek2),as.character(gatunek2),as.character(gatunek)),
         gatunek = ifelse(grepl("przypowieść",X655,ignore.case = TRUE)&!grepl("[^y]powieść",X655)&gatunek=="powieść","opowiadanie",as.character(gatunek))) %>%
  filter(!is.na(gatunek)) %>%
  select(ZA_UWAGI,gatunek) %>%
  mutate(gatunek = ifelse(gatunek=="dramat","tekst dramatyczny",
                          ifelse(gatunek=="pamiętniki","wspomnienia",
                                 ifelse(gatunek=="poezja","wiersz",
                                        ifelse(gatunek=="literatura podróżnicza","reportaż",
                                               ifelse(gatunek=="piosenka","wiersz",as.character(gatunek))))))) %>%
  group_by(ZA_UWAGI) %>%
  mutate(gatunek = paste(gatunek,collapse = ", ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(gatunek = gsub("(^.)","\\U\\1",perl = TRUE, gatunek))
#połączenie tytułu z gatunkiem
za_tytul <- marc_field_245 %>%
  left_join(.,gatunki_bn,by="ZA_UWAGI") %>% 
  mutate(gatunek = paste("[",gatunek,"]",sep = ""),
         gatunek = ifelse(gatunek=="[NA]",NA,as.character(gatunek))) %>% 
  unite("ZA_TYTUL", ZA_TYTUL:gatunek, sep = ". ",na.rm=TRUE) %>% 
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\. \\.",". "),
         ZA_TYTUL = str_replace(ZA_TYTUL,"(\\!)(\\.)|(\\?)(\\.)","\\1"))

#4: tytuł oryginału
#pole 246
marc_field_246 <- data %>%
  select(ZA_UWAGI,X246)%>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"~"),
         X246=str_replace_all(X246,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X246",sep = "~",direction = "long") %>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"^\\|")) %>%
  mutate(indicator = str_replace_all(X246,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X246,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_246)[1]))
colnames(empty_table) <-subfield_list
marc_field_246<-cbind(marc_field_246,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_246$X246 <- str_replace(marc_field_246$X246,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_246[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_246$X246),str_replace_all(gsub(string,"\\3",marc_field_246$X246),"\\${2}.", "~"),NA)
}
if("$n" %in% colnames(marc_field_246)) {
marc_field_246 <- marc_field_246[, colSums(is.na(marc_field_246)) != nrow(marc_field_246)] %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = ""),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = ""),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = "")) %>%
  ungroup() %>%
  unique() %>%
  unite("X246",`$a`:`$p`,sep = " ",na.rm = TRUE) %>% 
  mutate(X246 = str_replace_all(X246," +"," "),
         X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
         X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
  select(ZA_UWAGI, X246)
} else {
  marc_field_246 <- marc_field_246[, colSums(is.na(marc_field_246)) != nrow(marc_field_246)] %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`,`$b`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = "")) %>%
  ungroup() %>%
  unique() %>%
  unite("X246",`$a`:`$b`,sep = " ",na.rm = TRUE) %>% 
  mutate(X246 = str_replace_all(X246," +"," "),
         X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
         X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
  select(ZA_UWAGI, X246)
}

#pole 500
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"~"),
         X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
marc_field_500 <- marc_field_500 %>%
  filter(grepl("oryg\\.\\:",X500)) %>%
  mutate(X500 = str_remove(`$a`,"^Tyt\\. oryg\\.: |^Tyt\\, oryg\\.: |^.*?tyt\\. oryg\\.: "),
         X500 = str_remove(X500, "\\s+\\/\\s{0,}$"),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = str_replace_all(X500,"\\.{3} \\.{3}","... "),
         X500 = str_remove(X500, "\\.$"),
         X500 = str_remove(X500,"(,{0,1} {0,1})\\d{4}.*$|(, t|. T)yt. oryg. cyklu:")) %>%
  select(ZA_UWAGI,X500)
#tytuł oryginału
za_tytul_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_246,by="ZA_UWAGI") %>%
  left_join(.,marc_field_500,by="ZA_UWAGI") %>%
  mutate(X500 = ifelse(is.na(X500),NA,
                       ifelse(grepl("oryg",X500),NA,as.character(X500))),
         X500 = ifelse(!is.na(X500)&grepl("\\. - ",X500),str_replace(X500,"(.*?)(\\. - .*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Na książce pseud",X500),str_replace(X500,"(.*?)(\\. Na książce pseud.*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Przekł\\. wg",X500),str_replace(X500,"(.*?)(\\. Przekł\\. wg.*$)","\\1"),as.character(X500)),
         ZA_TYTUL_ORYGINALU = ifelse(is.na(X246)&is.na(X500),NA,
                                     ifelse(!is.na(X500),as.character(X500),as.character(X246))),
         ZA_TYTUL_ORYGINALU = str_remove_all(ZA_TYTUL_ORYGINALU,'\\"')) %>%
  select(ZA_UWAGI,ZA_TYTUL_ORYGINALU)

#5: język oryginału
marc_field_041 <- data %>%
  select(ZA_UWAGI,X041)%>%
  filter(X041!="") %>%
  mutate(X041=str_replace_all(X041,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X041",sep = "~",direction = "long") %>%
  filter(X041!="") %>%
  mutate(X041=str_remove_all(X041,"^\\|")) %>%
  mutate(indicator = str_replace_all(X041,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X041,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_041)[1]))
colnames(empty_table) <-subfield_list
marc_field_041<-cbind(marc_field_041,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_041$X041 <- str_replace(marc_field_041$X041,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_041[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_041$X041),str_replace_all(gsub(string,"\\3",marc_field_041$X041),"\\${2}.", "~"),NA)
}
za_jezyk_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_041 %>% select(ZA_UWAGI,ZA_JEZYK_ORYGINALU = `$a`),by="ZA_UWAGI") %>%
  mutate(ZA_JEZYK_ORYGINALU = str_replace_all(ZA_JEZYK_ORYGINALU,"\\$a",",")) %>%
  unique()

#6: współtwórcy
BN_wspoltworca <- data %>% 
  select(ZA_UWAGI,X245) %>% 
  mutate(wspoltworca = str_remove(str_remove_all(as.character(str_extract_all(data$X245,"(?<=; )(.*)(?=$)")),"\\.$"),"character\\(0\\)"),
         wspoltworca = str_remove_all(wspoltworca," et al\\."))

marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}

marc_field_700 <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         osoba = ifelse(!grepl(",",osoba)&str_count(osoba," ")==1,str_replace(osoba," ",", "),as.character(osoba)),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         ws_prosty = str_replace_all(str_to_lower(osoba), "\\W", ""),
         fu_prosta = str_replace_all(str_to_lower(funkcja), "\\W", ""))

BN_wspoltworca <- BN_wspoltworca %>% 
  left_join(marc_field_700,by="ZA_UWAGI")

x <- 1:nrow(BN_wspoltworca)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_wspoltworca$czy_nazwisko[i] <- grepl(BN_wspoltworca$OS_NAZWISKO[i],BN_wspoltworca$wspoltworca[i])
  BN_wspoltworca$czy_imie[i] <- grepl(BN_wspoltworca$OS_IMIE[i],BN_wspoltworca$wspoltworca[i])
}

if (grepl("0|1",BN_wspoltworca$czy_nazwisko[1])) {
  BN_wspoltworca <- BN_wspoltworca %>% 
    filter(czy_nazwisko==1|czy_imie==1)
} else {
  BN_wspoltworca <- BN_wspoltworca %>% 
    filter(czy_nazwisko==TRUE|czy_imie==TRUE)
}

BN_wspoltworca <- BN_wspoltworca %>% 
  left_join(.,PBL_wspoltworcy %>% select(OS_OSOBA_ID,OS_LICZBA_ZAPISOW,nazwa_prosta),by=c("ws_prosty"="nazwa_prosta")) %>%
  arrange(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,-OS_LICZBA_ZAPISOW)
BN_wspoltworca$id_grupy <- cumsum(!duplicated(BN_wspoltworca[1:4]))
BN_wspoltworca <- BN_wspoltworca[!duplicated(BN_wspoltworca$id_grupy),] %>%
  left_join(.,PBL_funkcje,by=c("fu_prosta"="nazwa")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL",NA,as.character(fo_symbol)),
         ZA_ADNOTACJE = NA) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja)

#7: opis współtwórców
za_opis_wspoltworcow <- BN_wspoltworca %>%
  select(ZA_UWAGI,funkcja,OS_IMIE,OS_NAZWISKO) %>% 
  unite("za_opis_wspoltworcow",c(funkcja,OS_IMIE,OS_NAZWISKO),sep = " ",na.rm = TRUE) %>% 
  group_by(ZA_UWAGI) %>%
  mutate(za_opis_wspoltworcow = paste(za_opis_wspoltworcow,collapse = ". ")) %>%
  ungroup() %>%
  unique() %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#8 wydanie
marc_field_250 <- data %>%
  select(ZA_UWAGI,X250)%>%
  filter(X250!="") %>%
  mutate(X250=str_replace_all(X250,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X250",sep = "~",direction = "long") %>%
  filter(X250!="") %>%
  mutate(X250=str_remove_all(X250,"^\\|")) %>%
  mutate(indicator = str_replace_all(X250,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X250,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_250)[1]))
colnames(empty_table) <-subfield_list
marc_field_250<-cbind(marc_field_250,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_250$X250 <- str_replace(marc_field_250$X250,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_250[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_250$X250),str_replace_all(gsub(string,"\\3",marc_field_250$X250),"\\${2}.", "~"),NA)
}

za_wydanie <- marc_field_250 %>%
  select(ZA_UWAGI, wydanie = `$a`) %>%
  mutate(wydanie = str_remove(wydanie," \\/$")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#9: instytucja sprawcza
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}

za_instytucja <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`) %>%
  filter(!is.na(X245c)) %>%
  mutate(instytucja = ifelse(grepl("\\;",X245c),str_replace_all(X245c, "(.*?)(\\;(?!.*\\;))( )+(.*?$)","\\4"),"")) %>%
  left_join(.,BN_wspoltworca,by="ZA_UWAGI")

x <- 1:lengths(za_instytucja[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  za_instytucja$czy_nazwisko[i] <- grepl(za_instytucja$OS_NAZWISKO[i],za_instytucja$X245c[i])
  za_instytucja$czy_imie[i] <- grepl(za_instytucja$OS_IMIE[i],za_instytucja$X245c[i])
}

za_instytucja <- za_instytucja %>%
  filter(is.na(czy_nazwisko)&is.na(czy_imie)) %>%
  filter(instytucja!="") %>%
  filter(!grepl("^\\[[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]|^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]",instytucja)) %>%
  mutate(instytucja = str_remove(instytucja,"\\.$")) %>%
  select(ZA_UWAGI,instytucja) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#10: wydawnictwo
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI, X260) %>%
  mutate(X260 = str_replace_all(X260,"s\\.n\\.", "b.w."), 
         X260 = str_replace_all(X260,"s\\.l\\.", "b.m."), 
         X260 = str_replace_all(X260,"S\\.l\\.", "b.m."), 
         X260 = str_remove(X260,"^\\\\+"), 
         rok_wydania = str_extract_all(X260, "(?<=\\$c).*(?=\\$e)|(?<=\\$c).*"), 
         bez_roku = str_replace_all(X260, ".\\$c.*", ""), 
         ile_wydawnictw = str_count(bez_roku, "\\$b"),
         ile_miejsc = str_count(bez_roku, "\\$a"),
         kolejnosc = str_replace_all(as.character(str_extract_all(bez_roku, "\\$.")), "[^a-z]", ""),
         bez_roku = str_replace_all(bez_roku, ";\\$b", ":$b"),
         wydaw_podziel = ifelse(ile_wydawnictw>ile_miejsc|kolejnosc=="caabb", str_replace_all(bez_roku, "(\\$a)(.*?)( :\\$b.*?)( :\\$b)", "\\1\\2\\3 ;$a\\2\\4"),bez_roku),
         wydawnictwo_test = str_replace_all(wydaw_podziel, "(\\$b)(.*?)( ;\\$a)", "\\1\\2|\\3")) %>%
  select(ZA_UWAGI,rok_wydania,wydawnictwo_test) %>%
  cSplit(., "wydawnictwo_test", sep = "|", direction = "long") %>%
  mutate(wydawnictwo = str_extract_all(wydawnictwo_test, "(?<=\\$b)(.*)"),
         miejsce_wydania = str_replace_all(str_extract_all(wydawnictwo_test, "(?<=\\$a)(.*)(?= {0,1}: {0,1}\\$b)|(?<=\\$a)(.*)($)")," ;\\$a", ", "),
         nazwa_prosta = str_to_lower(str_replace_all(str_replace_all(unlist(wydawnictwo_test), "\\$\\w", ""), "\\W", ""))) %>%
  left_join(.,PBL_wydawnictwa,by="nazwa_prosta") %>%
  mutate(to_samo = wydawnictwo==WY_NAZWA) %>%
  arrange(ZA_UWAGI,-to_samo,-WY_LICZBA_ZAPISOW)
BN_wydawnictwo$id_grupy <- cumsum(!duplicated(BN_wydawnictwo[1:3]))
BN_wydawnictwo <- BN_wydawnictwo[!duplicated(BN_wydawnictwo$id_grupy),] %>%
  mutate(WY_NAZWA = ifelse(!is.na(WY_NAZWA),as.character(WY_NAZWA),as.character(wydawnictwo)),
         WY_MIASTO = ifelse(!is.na(WY_MIASTO),as.character(WY_MIASTO),as.character(miejsce_wydania)),
         rok_wydania = str_replace_all(rok_wydania, "(.*)(\\.)", "\\1"),
         za_rok_wydania = ifelse(nchar(rok_wydania)==4,as.character(rok_wydania),NA),
         do_opisu = ifelse(is.na(za_rok_wydania),paste("[",str_extract(rok_wydania,"\\d{4}"),"]",sep = ""),""),
         WY_MIASTO = ifelse(substr(WY_MIASTO,1,1)=="["&substr(WY_MIASTO,nchar(WY_MIASTO),nchar(WY_MIASTO))!="]"&is.na(WY_WYDAWNICTWO_ID),paste(trim(WY_MIASTO),"]",sep = ""),as.character(WY_MIASTO))) %>%
  select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania,do_opisu)

#11: opis fizyczny książki
#pole 300 do opisu fizycznego
marc_field_300 <- data %>%
  select(ZA_UWAGI,X300)%>%
  filter(X300!="") %>%
  mutate(X300=str_replace_all(X300,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X300",sep = "~",direction = "long") %>%
  filter(X300!="") %>%
  mutate(X300=str_remove_all(X300,"^\\|")) %>%
  mutate(indicator = str_replace_all(X300,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X300,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_300)[1]))
colnames(empty_table) <-subfield_list
marc_field_300<-cbind(marc_field_300,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_300$X300 <- str_replace(marc_field_300$X300,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_300[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_300$X300),str_replace_all(gsub(string,"\\3",marc_field_300$X300),"\\${2}.", "~"),NA)
}

if("$e" %in% colnames(marc_field_300)) {
marc_field_300 <- marc_field_300 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$b` = str_remove(`$b`," \\;+$| \\:+$"),
         `$e` = ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`)&grepl("\\+ dysk|płyt",`$e`),str_extract(`$e`,"(?<=\\+)(dysk|płyt.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),
                       ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`),str_extract(`$e`,"(^.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),NA)),
         `$a` = ifelse(is.na(`$a`),"",as.character(`$a`)),
         `$b` = ifelse(is.na(`$b`),"",as.character(`$b`)),
         `$e` = ifelse(is.na(`$e`),"",as.character(`$e`)))
} else {
  marc_field_300 <- marc_field_300 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$b` = str_remove(`$b`," \\;+$| \\:+$"),
         `$a` = ifelse(is.na(`$a`),"",as.character(`$a`)),
         `$b` = ifelse(is.na(`$b`),"",as.character(`$b`)))
}
#pole 500 do opisu fizycznego
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
marc_field_500 <- marc_field_500 %>%
  mutate(`$a` = ifelse(grepl("oryg(\\.|\\,)",X500)&grepl("pseud|nazwa",X500,ignore.case = TRUE),str_replace(`$a`,"(^.*?)(\\. )(\\p{Lu}.*$)","\\3"),as.character(`$a`))) %>% 
  filter(!grepl("oryg(\\.|\\,)",`$a`)&grepl("pseud|nazwa|dotycz|pol",`$a`,ignore.case = TRUE)) %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))
  
#pole 546 do opisu fizycznego
marc_field_546 <- data %>%
  select(ZA_UWAGI,X546)%>%
  filter(X546!="") %>%
  mutate(X546=str_replace_all(X546,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X546",sep = "~",direction = "long") %>%
  filter(X546!="") %>%
  mutate(X546=str_remove_all(X546,"^\\|")) %>%
  mutate(indicator = str_replace_all(X546,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X546,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_546)[1]))
colnames(empty_table) <-subfield_list
marc_field_546<-cbind(marc_field_546,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_546$X546 <- str_replace(marc_field_546$X546,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_546[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_546$X546),str_replace_all(gsub(string,"\\3",marc_field_546$X546),"\\${2}.", "~"),NA)
}
marc_field_546 <- marc_field_546 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))

if("$e" %in% colnames(marc_field_300)) {
za_opis_ks <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,do_opisu),by="ZA_UWAGI") %>%
  left_join(.,marc_field_300 %>% select(ZA_UWAGI,X300a=`$a`,X300b=`$b`,X300e=`$e`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_500 %>% select(ZA_UWAGI,X500a=`$a`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_546 %>% select(ZA_UWAGI,X546a=`$a`),by="ZA_UWAGI")
za_opis_ks[is.na(za_opis_ks)]  <- ""
za_opis_ks <- za_opis_ks %>%
  mutate(za_opis_ks = paste(ifelse(do_opisu!="",paste(as.character(do_opisu),", ",sep = ""),""),ifelse(X300a!="",paste(as.character(X300a),", ",sep = ""),""),ifelse(X300b!="",paste(as.character(X300b),", ",sep = ""),""),ifelse(X300e!="",paste(as.character(X300e),", ",sep = ""),""),ifelse(X500a!="",paste(as.character(X500a),", ",sep = ""),""),ifelse(X546a!="",as.character(X546a),""),sep = ""),
         za_opis_ks = str_remove(za_opis_ks,"(, )+$")) %>%
  select(ZA_UWAGI,za_opis_ks) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(za_opis_ks))
} else {
  za_opis_ks <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,do_opisu),by="ZA_UWAGI") %>%
  left_join(.,marc_field_300 %>% select(ZA_UWAGI,X300a=`$a`,X300b=`$b`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_500 %>% select(ZA_UWAGI,X500a=`$a`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_546 %>% select(ZA_UWAGI,X546a=`$a`),by="ZA_UWAGI")
za_opis_ks[is.na(za_opis_ks)]  <- ""
za_opis_ks <- za_opis_ks %>%
  mutate(za_opis_ks = paste(ifelse(do_opisu!="",paste(as.character(do_opisu),", ",sep = ""),""),ifelse(X300a!="",paste(as.character(X300a),", ",sep = ""),""),ifelse(X300b!="",paste(as.character(X300b),", ",sep = ""),""),ifelse(X500a!="",paste(as.character(X500a),", ",sep = ""),""),ifelse(X546a!="",as.character(X546a),""),sep = ""),
         za_opis_ks = str_remove(za_opis_ks,"(, )+$")) %>%
  select(ZA_UWAGI,za_opis_ks) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(za_opis_ks))
}
za_opis_ks$id_grupy <- cumsum(!duplicated(za_opis_ks[1]))
za_opis_ks <- za_opis_ks[!duplicated(za_opis_ks$id_grupy),] %>%
  select(-id_grupy)

wsp_info <- za_opis_ks %>% 
  left_join(tytul_wspolwydanie,by="ZA_UWAGI") %>% 
  left_join(BN_autor,by="ZA_UWAGI") %>% 
  mutate(wsp = paste("[Współwyd.: ",ifelse(AM_IMIE=="*","",AM_IMIE)," ",AM_NAZWISKO,": ",ZA_TYTUL,"]", sep = ""),
         za_uwagi2 = str_remove_all(ZA_UWAGI,".$"))

wsp_info %$%  
    { za_uwagi2 == dplyr::lag(za_uwagi2, 1)} %>% 
    as.numeric() %>% 
    {.} -> wsp_info$same
wsp_info$same[1] <- 0

wsp_info <- wsp_info %>% 
  arrange(za_uwagi2,-same)

za_opis_ks <- za_opis_ks %>% 
  bind_cols(wsp_info %>% select(wsp))

#12: seria wydawnicza
marc_field_490 <- data %>%
  select(ZA_UWAGI,X490,X800,X830) %>%
  mutate(X490 = ifelse(grepl("U\\+",X490),as.character(X830),as.character(X490))) %>%
  mutate(X800 = ifelse(X490!="","",as.character(X800)),
         X830 = ifelse(X490!="","",as.character(X830)),
         X800 = str_replace(X800,"(\\$a)(.*)(\\$t)","\\1"),
         X490 = ifelse(X490==""&X830!="",as.character(X830),
                       ifelse(X490==""&X800!="",as.character(X800),as.character(X490)))) %>%
  select(ZA_UWAGI,X490) %>%
  filter(X490!="") %>%
  mutate(X490=str_replace_all(X490,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X490",sep = "~",direction = "long") %>%
  filter(X490!="") %>%
  mutate(X490=str_remove_all(X490,"^\\|")) %>%
  mutate(indicator = str_replace_all(X490,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X490,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_490)[1]))
colnames(empty_table) <-subfield_list
marc_field_490<-cbind(marc_field_490,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_490$X490 <- str_replace(marc_field_490$X490,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_490[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_490$X490),str_replace_all(gsub(string,"\\3",marc_field_490$X490),"\\${2}.", "~"),NA)
}
za_seria_wydawnicza <- marc_field_490 %>%
  mutate(`$a` = str_replace_all(`$a`,"(=)(\\$a)","\\1 "),
         `$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$v` = ifelse(is.na(`$v`),"",as.character(`$v`))) %>%
  filter(!is.na(`$a`)) %>%
  mutate(seria = str_remove(paste("(",`$a`,"; ",`$v`,")",sep = ""),"; (?=\\)$)"),
         seria = gsub("( : )(.)",". \\U\\2",perl=TRUE,seria)) %>%
  select(ZA_UWAGI,seria) %>%
  group_by(ZA_UWAGI) %>%
  mutate(seria = paste(seria,collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(seria = str_replace_all(seria,"\\$.","; ")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#13: tomy
za_tomy <- data %>%
  select(ZA_UWAGI) %>%
  mutate(za_tomy = NA)

#14: adnotacje
za_adnotacje <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  mutate(ZA_ADNOTACJE = ifelse(is.na(ZA_ADNOTACJE),"",paste(as.character(ZA_ADNOTACJE),"# ",sep = "")),
         ZA_ADNOTACJE = str_remove(ZA_ADNOTACJE,"(# )+$")) %>%
  select(ZA_UWAGI,ZA_ADNOTACJE) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(ZA_ADNOTACJE))
za_adnotacje$id_grupy <- cumsum(!duplicated(za_adnotacje[1]))
za_adnotacje <- za_adnotacje[!duplicated(za_adnotacje$id_grupy),] %>%
  select(-id_grupy)

#15: BN_URL
BN_URL <- data %>%
  select(ZA_UWAGI,BN_URL)

#wyrównanie liczby wierszy do liczby wierszy obiektu data
BN_autor <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,AM_AUTOR_ID,AM_NAZWISKO,AM_IMIE),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, AM_AUTOR_ID = paste(AM_AUTOR_ID, collapse="|"), AM_NAZWISKO = paste(AM_NAZWISKO, collapse="|"), AM_IMIE = paste(AM_IMIE, collapse="|"))
BN_wspoltworca <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,OS_OSOBA_ID,OS_NAZWISKO,OS_IMIE,fo_symbol),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, OS_OSOBA_ID = paste(OS_OSOBA_ID, collapse="|"), OS_NAZWISKO = paste(OS_NAZWISKO, collapse="|"), OS_IMIE = paste(OS_IMIE, collapse="|"), fo_symbol = paste(fo_symbol, collapse="|")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL","NA",as.character(fo_symbol)))
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, WY_WYDAWNICTWO_ID = paste(WY_WYDAWNICTWO_ID, collapse="|"), WY_NAZWA = paste(WY_NAZWA, collapse="|"), WY_MIASTO = paste(WY_MIASTO, collapse="|"), za_rok_wydania = paste(unique(za_rok_wydania), collapse="|")) %>%
  mutate(za_rok_wydania = ifelse(za_rok_wydania=="NA","",as.integer(za_rok_wydania)))

#połączenie wszystkich elementów w jedną tabelę
kolejnosc <- data.frame(kolejnosc=c("ZA_UWAGI","RZ_NAZWA","ZA_RO_ROK","ZA_TYPE","RZ_RODZAJ_ID","DZ_NAZWA","DZ_DZIAL_ID","TW_TWORCA_ID","AM_AUTOR_ID","AM_NAZWISKO","AM_IMIE","ZA_TYTUL","ZA_TYTUL_ORYGINALU","ZA_JEZYK_ORYGINALU","OS_OSOBA_ID","OS_NAZWISKO","OS_IMIE","fo_symbol","za_opis_wspoltworcow","wydanie","za_tomy","instytucja","WY_WYDAWNICTWO_ID","WY_MIASTO","WY_NAZWA","za_rok_wydania","za_opis_ks","seria","TW_NAZWISKO","TW_IMIE","redaktor_dzialu","ZA_ADNOTACJE","BN_URL"))
polaczone <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,pola_pbl,by = "ZA_UWAGI") %>%
  left_join(.,BN_autor,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,za_jezyk_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_wspoltworcow,by = "ZA_UWAGI") %>%
  left_join(.,za_wydanie,by = "ZA_UWAGI") %>%
  left_join(.,za_instytucja,by = "ZA_UWAGI") %>%
  left_join(.,BN_wydawnictwo,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_ks,by = "ZA_UWAGI") %>%
  left_join(.,za_seria_wydawnicza,by = "ZA_UWAGI") %>%
  left_join(.,za_tomy,by = "ZA_UWAGI") %>%
  left_join(.,za_adnotacje,by = "ZA_UWAGI") %>%
  left_join(.,BN_URL,by = "ZA_UWAGI") %>%
  select(as.vector(kolejnosc$kolejnosc))
colnames(polaczone) <- c("rekord_BN","rz_nazwa","za_ro_rok","za_type","rz_rodzaj_id","DZ_NAZWA","DZ_DZIAL_ID","tw_tworca_id","am_autor_id","am_nazwisko","am_imie","za_tytul","za_tytul_oryginalu","za_jezyk_oryginalu","os_osoba_id","os_nazwisko","os_imie","fo_symbol","za_opis_wspoltworcow","za_wydanie","za_tomy","za_instytucja","wy_wydawnictwo_id","wy_miejsce","wy_nazwa","za_rok_wydania","za_opis_fizyczny_ksiazki","za_seria_wydawnicza","tw_nazwisko","tw_imie","pracownik","za_adnotacje","BN_URL")

#zasygnalizowanie niepoprawnego kodowania
x <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("<U\\+(....)>",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)!=0,paste(polaczone$za_adnotacje,paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole.",sep = ""),sep = "# "),paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole.",sep = "")),as.character(polaczone$za_adnotacje))
  polaczone[,i] <- gsub("<U\\+(....)>", "???", polaczone[,i])
}
#zasygnalizowanie obecności znaku $ w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("\\$",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
#zasygnalizowanie obecności frazy "character(0)" w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("character\\(0\\)",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
#zasygnalizowanie obecności znaku # w opisie współtwórców
polaczone$za_adnotacje <- ifelse(grepl("\\#",polaczone$za_opis_wspoltworcow),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności \"#\" współtwórcy z pola 700).",paste(polaczone$za_adnotacje,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności # współtwórcy z pola 700).",sep = "# ")),as.character(polaczone$za_adnotacje))

out <- cSplit(polaczone, c("am_autor_id", "am_nazwisko", "am_imie","os_osoba_id","os_nazwisko", "os_imie", "fo_symbol","wy_wydawnictwo_id","wy_miejsce","wy_nazwa"),sep = "|",direction = "long") %>%
  unique()

out$rekord_BN <- ifelse(is.na(out$rekord_BN),'',as.character(out$rekord_BN))
out$rz_nazwa <- ifelse(is.na(out$rz_nazwa),'',as.character(out$rz_nazwa))
out$za_ro_rok <- ifelse(is.na(out$za_ro_rok),'',as.character(out$za_ro_rok))
out$za_type <- ifelse(is.na(out$za_type),'',as.character(out$za_type))
out$rz_rodzaj_id <- ifelse(is.na(out$rz_rodzaj_id),'',as.character(out$rz_rodzaj_id))
out$DZ_NAZWA <- ifelse(is.na(out$DZ_NAZWA),'',as.character(out$DZ_NAZWA))
out$DZ_DZIAL_ID <- ifelse(is.na(out$DZ_DZIAL_ID),'',as.character(out$DZ_DZIAL_ID))
out$tw_tworca_id <- ifelse(is.na(out$tw_tworca_id),'',as.character(out$tw_tworca_id))
out$am_autor_id <- ifelse(is.na(out$am_autor_id),'',as.character(out$am_autor_id))
out$am_nazwisko <- ifelse(is.na(out$am_nazwisko),'',as.character(out$am_nazwisko))
out$am_imie <- ifelse(is.na(out$am_imie),'',as.character(out$am_imie))
out$za_tytul <- ifelse(is.na(out$za_tytul),'',as.character(out$za_tytul))
out$za_tytul_oryginalu <- ifelse(is.na(out$za_tytul_oryginalu),'',as.character(out$za_tytul_oryginalu))
out$za_jezyk_oryginalu <- ifelse(is.na(out$za_jezyk_oryginalu),'',as.character(out$za_jezyk_oryginalu))
out$os_osoba_id <- ifelse(is.na(out$os_osoba_id),'',as.character(out$os_osoba_id))
out$os_nazwisko <- ifelse(is.na(out$os_nazwisko),'',as.character(out$os_nazwisko))
out$os_imie <- ifelse(is.na(out$os_imie),'',as.character(out$os_imie))
out$fo_symbol <- ifelse(is.na(out$fo_symbol),'',as.character(out$fo_symbol))
out$za_opis_wspoltworcow <- ifelse(is.na(out$za_opis_wspoltworcow),'',as.character(out$za_opis_wspoltworcow))
out$za_wydanie <- ifelse(is.na(out$za_wydanie),'',as.character(out$za_wydanie))
out$za_tomy <- ifelse(is.na(out$za_tomy),'',as.character(out$za_tomy))
out$za_instytucja <- ifelse(is.na(out$za_instytucja),'',as.character(out$za_instytucja))
out$wy_wydawnictwo_id <- ifelse(is.na(out$wy_wydawnictwo_id),'',as.character(out$wy_wydawnictwo_id))
out$wy_miejsce <- ifelse(is.na(out$wy_miejsce),'',as.character(out$wy_miejsce))
out$wy_nazwa <- ifelse(is.na(out$wy_nazwa),'',as.character(out$wy_nazwa))
out$za_rok_wydania <- ifelse(is.na(out$za_rok_wydania),'',as.character(out$za_rok_wydania))
out$za_opis_fizyczny_ksiazki <- ifelse(is.na(out$za_opis_fizyczny_ksiazki),'',as.character(out$za_opis_fizyczny_ksiazki))
out$za_seria_wydawnicza <- ifelse(is.na(out$za_seria_wydawnicza),'',as.character(out$za_seria_wydawnicza))
out$tw_nazwisko <- ifelse(is.na(out$tw_nazwisko),'',as.character(out$tw_nazwisko))
out$tw_imie <- ifelse(is.na(out$tw_imie),'',as.character(out$tw_imie))
out$pracownik <- ifelse(is.na(out$pracownik),'',as.character(out$pracownik))
out$za_adnotacje <- ifelse(is.na(out$za_adnotacje),'',as.character(out$za_adnotacje))
out$BN_URL <- ifelse(is.na(out$BN_URL),'',as.character(out$BN_URL))

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same
out$same[1] <- 0
out$dzielone <- paste(out$am_autor_id,out$am_nazwisko,out$am_imie,out$os_osoba_id,out$os_nazwisko,out$os_imie,out$fo_symbol,out$wy_wydawnictwo_id,out$wy_miejsce,out$wy_nazwa,sep = "")

out <- out %>%
  filter(!(same==1&dzielone=="")) %>%
  select(1:33)

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same

#ucięcie zbyt długich ciągów znaków, by weszły do oracle'a
dlugosci <- data.frame(pole = c("am_nazwisko", "am_imie", "za_tytul", "za_tytul_oryginalu", "za_jezyk_oryginalu", "os_nazwisko", "os_imie", "za_opis_wspoltworcow", "za_instytucja", "wy_miejsce", "wy_nazwa", "za_opis_fizyczny_ksiazki", "za_seria_wydawnicza", "tw_nazwisko", "tw_imie", "za_adnotacje"), liczba_znakow = c(50,40,500,500,100,50,40,500,255,40,255,1000,255,200,40,2000))
x <- match(dlugosci$pole,names(out))
for (i in x) {
  progress(match(i,x), max.value = length(x))
  dlugosc <- dlugosci$liczba_znakow[match(names(out[i]),dlugosci$pole)]
  out$za_adnotacje <- ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje!="",paste(out$za_adnotacje,paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),sep = "# "),
                             ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje=="",paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),as.character(out$za_adnotacje)))
  
  out[,i] <- ifelse(dlugosc<nchar(as.character(out[,i])),as.character(substr(out[,i],1,dlugosc)),as.character(out[,i]))
}

out$rekord_BN[out$same == 1] <- ""
out$rz_nazwa[out$same == 1] <- ""
out$za_ro_rok[out$same == 1] <- ""
out$za_type[out$same == 1] <- ""
out$rz_rodzaj_id[out$same == 1] <- ""
out$DZ_NAZWA[out$same == 1] <- ""
out$DZ_DZIAL_ID[out$same == 1] <- ""
out$tw_tworca_id[out$same == 1] <- ""
out$za_tytul[out$same == 1] <- ""
out$za_tytul_oryginalu[out$same == 1] <- ""
out$za_jezyk_oryginalu[out$same == 1] <- ""
out$za_opis_wspoltworcow[out$same == 1] <- ""
out$za_wydanie[out$same == 1] <- ""
out$za_tomy[out$same == 1] <- ""
out$za_instytucja[out$same == 1] <- ""
out$za_rok_wydania[out$same == 1] <- ""
out$za_opis_fizyczny_ksiazki[out$same == 1] <- ""
out$za_seria_wydawnicza[out$same == 1] <- ""
out$tw_nazwisko[out$same == 1] <- ""
out$tw_imie[out$same == 1] <- ""
out$pracownik[out$same == 1] <- ""
out$za_adnotacje[out$same == 1] <- ""
out$BN_URL[out$same == 1] <- ""

out <- out %>%
  select(1:33)

#pętla zapisująca po ok. 2000 wierszy z uwzględnieniem kompletności rekordów bibliograficznych rozpisanych na kilka wierszy
out <- out %>%
  mutate(podzial = ifelse(rekord_BN!="",as.character(rekord_BN),NA)) %>%
  fill(podzial)
ile <- unique(out$podzial)
ile <- split(unique(ile), ceiling(seq_along(unique(ile))/1500))
#aktualizacja - wpisz właściwy rok w ścieżkę pliku
x <- 1:length(ile)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  final <- out %>%
    filter(podzial %in% ile[[i]]) %>%
    select(-podzial)
  write.xlsx(final, paste("C:/Users/Cezary/Desktop/2011_wspolwydanie_do_importu",i,".xlsx",sep = ""),sheetName = "gotowe")
}

bezpiecznik UWAGA! Najpierw należy przeprowadzić import do bazy, a następnie egzekwować poniższą część kodu

#w formularzu książkowym wyszukaj w polu uwag frazę '%akceptuje:NA%' i - jeśli takowa wystąpi - zastąp NA imieniem właściwego pracownika
#wiem, że to skasowaliśmy, ale doszedłem do wniosku, że jednak warto to sprawdzić
#automatyczny IOK dla rekordów bibliograficznych
#aktualizacja - wpisz właściwy rok w ścieżkę pliku

nadpisanie_zapisow_IOK <- read.csv2("C:/Users/Cezary/Desktop/imp_2011_automatyczne_podmiotowe.csv", encoding = "UTF-8", header = TRUE, stringsAsFactors = FALSE)

#aktualizacja - wpisać w selekcie dla za_uwagi właściwą frazę dla rocznika, np. 'BN: 2009%'
nadpisanie_zapisow_IOK <- nadpisanie_zapisow_IOK %>%
  mutate(rekord_BN = as.character(rekord_BN)) %>% 
  left_join(.,dbGetQuery(PBL,
                             "select z.za_zapis_id, z.za_status_imp, z.za_uwagi
                              from pbl_zapisy z
                              where za_uwagi like 'BN: 2011%'
                              and z.za_url_bn is not null") %>% mutate(ZA_UWAGI = str_extract(ZA_UWAGI,"(?<=BN: )(.*?)(?=, import)")),by=c("rekord_BN"="ZA_UWAGI")) %>% 
  rename(jest = ZA_STATUS_IMP) %>% 
  mutate(ID2 = NA) %>% 
  select(ZA_ZAPIS_ID,ID2,jest,powinno_byc)
#aktualizacja - wpisz właściwy rok w ścieżkę pliku
write.xlsx(nadpisanie_zapisow_IOK, "C:/Users/Cezary/Desktop/2011_nadpisanie_zapisow_IOK.xlsx",sheetName = "ZA_STATUS_IMP")

#bezpiecznik
#automatyczny IOK dla nowych twórców w kartotece powinien zostać przeprowadzony z poziomu importera

#automatycznie nadpisać rekordy bibliograficzne i kartoteczne przed kolejnym krokiem

#bezpiecznik
#jeśli podczas importu nie da się zaimportować rekordów - wprowadź je ręcznie w tym momencie
#kolumnę BN-URL należy nadpisać automatycznie
#docelowo przygotowujemy plik od razu na dysk, ale na razie xlsx do wgrania na dysk (brak funkcjonalności googlesheets4)
#po tym przygotować na dysku unikatowe linki
bn_ok <- chunk11
kolejnosc <- c("pracownik","ZA_ZAPIS_ID","typ_ksiazki","link","link_1","rok","status","blad_w_imporcie_tytulu","X100","X245","X650","X655","X246","X250","X260","X300","X380","X490","X500","X501","X546","X600","X700","X041","X080")
#aktualizacja - wpisać w selekcie dla za_uwagi właściwą frazę dla rocznika, np. 'BN: 2010%'
rocznik_pbl_po_imporcie <- dbGetQuery(PBL,
                                       "select z.za_zapis_id, z.za_status_imp, z.za_uwagi
                                        from pbl_zapisy z
                                        where za_uwagi like 'BN: 2011%'
                                        and z.za_url_bn is not null") %>% 
  mutate(ZA_UWAGI = str_extract(ZA_UWAGI,"(?<=BN: )(.*?)(?=, import)")) %>%
  rename(status = ZA_STATUS_IMP) %>% 
  left_join(.,bn_ok %>% select(pracownik = redaktor_dzialu,typ_ksiazki = rodzaj_ksiazki,link = BN_URL, rok, X100, X245, X650, X655, X246, X250, X260, X300, X380, X490, X500, X501, X546, X600, X700, X041, X080,ZA_UWAGI) %>% mutate(link_1 = paste("=HYPERLINK(\"",link,"\";\"link do książki w BN\")",sep = ""), blad_w_imporcie_tytulu = FALSE),by="ZA_UWAGI") %>% 
  select(noquote(kolejnosc))
rocznik_pbl_po_imporcie$pracownik[rocznik_pbl_po_imporcie$status=="IOK"] <- "AUTOMAT"
#aktualizacja - wpisz właściwy rok w ścieżkę pliku
write.xlsx(rocznik_pbl_po_imporcie, "C:/Users/Cezary/Desktop/ks_BN_2011_listy_pracowników.xlsx",sheetName = "lista_ksiazek")
#utwórz nowy podfolder w folderze importu BN i prześlij listę na dysk, przygotuj widoki filtrów dla wszystkich osób i roześlij unikatowe linki
#TUTAJ - zrobić dopiero po imporcie 2010!!!
#bazować na bn_ok z zapytaniem SQL dzięki zawartości pola bn rekord
#zaktualizować plik na dysku: "mapowanie_osob_bn_pbl_po_imporcie" o nowe relacje osobowe pbl-bn
bn_ok <- chunk11
nowe_relacje <- bn_ok %>% 
  filter(is.na(TW_TWORCA_ID)&!is.na(TW_NAZWISKO)) %>% 
  select(X100,TW_NAZWISKO,TW_IMIE) %>% 
  filter(!grepl("\\|",X100)) %>% 
  unique() %>% 
  mutate(licznik = 1:nrow(.))

marc_field_100 <- nowe_relacje %>%
  select(licznik,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(nowe_relacje$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}

nowe_relacje <- nowe_relacje %>% 
  left_join(.,marc_field_100 %>% unite("BN_osoba",`$a`:`$c`,sep = " ",na.rm = TRUE) %>% select(licznik,BN_osoba),by="licznik") %>% 
  left_join(.,dbGetQuery(PBL,
                             "select tw.tw_tworca_id,tw.tw_nazwisko,tw.tw_imie
                              from pbl_tworcy tw"),by=c("TW_NAZWISKO","TW_IMIE")) %>%
  select(TW_TWORCA_ID,TW_NAZWISKO,TW_IMIE,BN_osoba)

pbl_bn_import <- data.frame(stringsAsFactors=FALSE)
x <- 1:length(nowe_relacje$TW_TWORCA_ID)

for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  tryCatch({ 
  id <- jsonlite::fromJSON(str_replace_all(paste("https://data.bn.org.pl/api/authorities.json?limit=100&name=",nowe_relacje$BN_osoba[i],sep = "")," ","%20")) %>% .$authorities %>% 
    filter(title=="") %>% .$id
  if (length(id)==0) {
    id <- "brak danych (CR)"
  } 
  }, error=function(e){
                     id <<- "brak danych (CR)"
  })
  iteration <- data.frame(nowe_relacje %>% select(1:4) %>% slice(i), id = id)
  pbl_bn_import <- rbind(pbl_bn_import,iteration)
}

pbl_bn_import_fix <- pbl_bn_import %>% 
  filter(id=="brak danych (CR)")
pbl_bn_import <- pbl_bn_import %>% 
  filter(id %notin% pbl_bn_import_fix$id)
#aktualizacja - ręcznie uzupełnij identyfikatory dla osób BN, które nie zostały znalezione automatycznie (szukaj przy użyciu/z wykluczeniem znaków diakrytycznych, po fragmentach stringów)
#szukaj w schemacie:http://data.bn.org.pl/api/authorities.json?limit=100&name=Karl%20Ove%20(1968-%20) podmieniając wartości po "name="
# jeśli niemo zliwe jest ustalenie id w obiekcie reczne_uzupelnienie w odpowiednim miejscu wstaw frazę "brak danych (CR)"
reczne_uzupelnienie <- c(1098768,2525865,1212662,2550093,2838554,1700782,2705401,2535187,"brak danych (CR)",3183246,2259454,2428820,3134025,"brak danych (CR)",2884785,1070066,"brak danych (CR)",2818578,2437406,1182189,1624489,"brak danych (CR)","brak danych (CR)",2520519,2812495,"brak danych (CR)")
pbl_bn_import_fix$id <- reczne_uzupelnienie
pbl_bn_import <- pbl_bn_import %>% 
  bind_rows(pbl_bn_import_fix %>% filter(id != "brak danych (CR)"))

pbl_bn_viaf_import <- data.frame(stringsAsFactors=FALSE)
x <- 1:length(pbl_bn_import$TW_TWORCA_ID)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  name <- paste(str_replace_all(str_remove_all(paste(unlist(jsonlite::fromJSON(paste("https://data.bn.org.pl/api/authorities.json?id=",pbl_bn_import$id[i],sep = "")) %>% .$authorities %>% .$marc %>% .$fields %>% `[[`(1) %>% .$`100` %>% `[[`(3)),collapse = "|"),"\\|NA"),"(\\|)(\\(\\d+)"," \\2"),str_replace_all(str_remove_all(paste(unlist(jsonlite::fromJSON(paste("https://data.bn.org.pl/api/authorities.json?id=",pbl_bn_import$id[i],sep = "")) %>% .$authorities %>% .$marc %>% .$fields %>% `[[`(1) %>% .$`400` %>% `[[`(3)),collapse = "|"),"\\|NA"),"(\\|)(\\(\\.+)"," \\2"),sep = "|")
  viaf <- str_remove_all(paste(unlist(jsonlite::fromJSON(paste("https://data.bn.org.pl/api/authorities.json?id=",pbl_bn_import$id[i],sep = "")) %>% .$authorities %>% .$marc %>% .$fields %>% `[[`(1) %>% .$`024` %>% .$subfields),collapse = "|"),"(\\|NA)|(\\|viaf)")
  iteration <- data.frame(pbl_bn_import %>% select(1:3,5) %>% slice(i), name = name, viaf = viaf)
  pbl_bn_viaf_import <- rbind(pbl_bn_viaf_import,iteration)
}

pbl_bn_viaf_import <- pbl_bn_viaf_import %>% 
  rename(pbl_id = TW_TWORCA_ID,
         pbl_nazwisko = TW_NAZWISKO,
         pbl_imie = TW_IMIE,
         BN_id = id,
         BN_name = name) %>% 
  mutate(czy_ten_sam = "tak") %>% 
  select(pbl_id,pbl_nazwisko,pbl_imie,BN_id,BN_name,czy_ten_sam,viaf) %>% 
  unique()

#zapisać plik i jego treść wkleić na dysk do tabeli "mapowanie_osob_bn_pbl_po_imporcie"
write.xlsx(pbl_bn_viaf_import, "C:/Users/Cezary/Desktop/relacje_osobowe_pbl_bn.xlsx",sheetName = "pbl-bn")
#następnie przeanalizować zawartość wkejonej części i zostawić "tak" w kolumnie F tylko dla poprawnych utożsamień (osoba w PBL to osoba w BN)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KVVdBR0EhDQpXeWN6ecWbY2nEhyBsaXN0xJkgbWFwb3dhbmllX29zb2JfYm5fcGJsX3BvX2ltcG9yY2llICh6YSBkdcW8byBuaWVwb3ByYXdueWNoIHJlbGFjamkgcGJsLWJuIHBvIG9zdGF0bmltIGltcG9yY2llKQ0KUHJ6ZWQgcm96cG9jesSZY2llbSBwcmFjeSB6YWt0dWFsaXp1aiB6Z29kbmllIHogb2JlY255bSBzdGFuZW0gYmF6eSBsaXN0xJkga3NpxIXFvGVrIG5hIGR5c2t1IHphIHBvcHJ6ZWRuaSByb2N6bmlrLg0KUHJ6ZWQgcm96cG9jesSZY2llbSBwcmFjeSB3eXN6dWthaiBmcmF6eSAiYmV6cGllY3puaWsiIGkgImFrdHVhbGl6YWNqYSIuDQpgYGB7ciBXY3p5dGFuaWUgcGxpa8Ozd30NCiNpbnN0YWxsLnBhY2thZ2VzKGMoInV0ZjgiLCJnb29nbGVzaGVldHM0Iiwiem9vIiwic3RyaW5nciIsInNwbGl0c3RhY2tzaGFwZSIsInBseXIiLCJkcGx5ciIsInNxbGRmIiwic3RyaW5nZGlzdCIsImZ1enp5am9pbiIsImRhdGEudGFibGUiLCJzdk1pc2MiLCJ0aWR5dmVyc2UiLCJSSkRCQyIsImFycmFuZ2VtZW50cyIsInRva2VuaXplcnMiLCJvcGVueGxzeCIsImpzb25saXRlIiwicGFjbWFuIikpDQojZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJyLWxpYi9nYXJnbGUiKQ0KDQojYmlibGlvdGVraQ0Kb3B0aW9ucyhqYXZhLnBhcmFtZXRlcnMgPSAiLVhteDMyMDAwbSIpDQpvcHRpb25zKHNjaXBlbiA9IDk5OSkNCnBhY21hbjo6cF9sb2FkKHV0ZjgsZ29vZ2xlc2hlZXRzNCx6b28sc3RyaW5ncixzcGxpdHN0YWNrc2hhcGUscGx5cixkcGx5cixzcWxkZixzdHJpbmdkaXN0LGZ1enp5am9pbixkYXRhLnRhYmxlLHN2TWlzYyx0aWR5dmVyc2UsUkpEQkMsYXJyYW5nZW1lbnRzLHRva2VuaXplcnMsb3Blbnhsc3gsanNvbmxpdGUpDQpgJW5vdGluJWAgPC0gTmVnYXRlKGAlaW4lYCkNCiNwb8WCxIVjemVuaWUgeiBiYXrEhSBQQkwNCmpkYmNEcml2ZXIgPUpEQkMoIm9yYWNsZS5qZGJjLk9yYWNsZURyaXZlciIsY2xhc3NQYXRoPSJDOi9Vc2Vycy9DZXphcnkvRG93bmxvYWRzL29qZGJjNi5qYXIiKQ0KUEJMIDwtIGRiQ29ubmVjdChqZGJjRHJpdmVyLCAiamRiYzpvcmFjbGU6dGhpbjpALy9wYmwuaWJsLnBvem5hbi5wbDoxNTIxL3hlIiwgIklCTF9TRUxFQ1QiLCAiQ1IzMzM0NDQiKQ0KDQojd2dyYW5pZSB6YmlvcsOzdyBrc2nEhcW8ZWsNCiNha3R1YWxpemFjamEgLSB3cHJvd2Fkxbogd8WCYcWbY2l3xIUgxZtjaWXFvGvEmSBwbGlrdSAoem1pZcWEIHJvaykNCmJuX2tzIDwtIHJlYWQuY3N2MigiQzovVXNlcnMvQ2V6YXJ5L0Rvd25sb2Fkcy9ibl9rc18yMDExLmNzdiIsIGVuY29kaW5nID0gIlVURi04IiwgaGVhZGVyID0gVFJVRSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKSAlPiUNCiAgbXV0YXRlKHJvayA9IHN0cl9zdWIoWDAwOCw4LDExKSkgJT4lIA0KICAjYWt0dWFsaXphY2phIC0gd3Byb3dhZMW6IGRvIGZpbHRyYSB3xYJhxZtjaXd5IHJvaw0KICBmaWx0ZXIocm9rID09IDIwMTEsDQogICAgICAgICAhZ3JlcGwoIlxcXFwkYUFydHlrdcWCeXxcXFxcJERydWtpIHVsb3RuZSIsWDM4MCksDQogICAgICAgICAhZ3JlcGwoIlxcJGFOYWRiaXRraSBpIG9kYml0a2kiLFg2NTUpLA0KICAgICAgICAgZ3JlcGwoIktzacSFxbxraSIsWDM4MCxpZ25vcmUuY2FzZSA9IEZBTFNFKXxYMzgwPT0iIiwNCiAgICAgICAgIGdyZXBsKCJcXCRhV0F8XFwkYVcgIixYMDQwKSwNCiAgICAgICAgIFg2NTUhPSJcXDckYUtvbWlrcyQyREJOIikgJT4lDQogIG11dGF0ZShYMjQ1ID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiBcXC8gXFwkYyIsIiAvJGMiKSwNCiAgICAgICAgIEJOX1VSTCA9IHBhc3RlKCJodHRwczovL2thdGFsb2dpLmJuLm9yZy5wbC9kaXNjb3ZlcnkvZnVsbGRpc3BsYXk/ZG9jaWQ9YWxtYSIsYXMuY2hhcmFjdGVyKFgwMDkpLCImY29udGV4dD1MJnZpZD00OE9NTklTX05MT1A6NDhPTU5JU19OTE9QJmxhbmc9cGwiLHNlcCA9ICIiKSwNCiAgICAgICAgIEJOX1VSTCA9IHN0cl9yZXBsYWNlKEJOX1VSTCwiODgmIiwiNjYmIikpDQoNCiMjIyBwcnplbmllxZvEhyBrb2xlam55Y2ggYXV0b3LDs3cgeiA3MDAgZG8gcG9sYSAxMDANCm1hcmNfZmllbGRfNzAwIDwtIGJuX2tzICU+JQ0KICBzZWxlY3QoaWQsWDcwMCklPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDcwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZW1vdmVfYWxsKFg3MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChibl9rcyRYNzAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNzAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzcwMDwtY2JpbmQobWFyY19maWVsZF83MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCg0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF83MDAkWDcwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzcwMCRYNzAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzcwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzcwMCRYNzAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF83MDAkWDcwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzcwMCA8LSBtYXJjX2ZpZWxkXzcwMCAlPiUNCiAgZmlsdGVyKGlzLm5hKGAkZWApJmlzLm5hKGAkdGApKSAlPiUNCiAgc2VsZWN0KGlkLCBYNzAwKSAlPiUNCiAgbXV0YXRlKGRydWdpX2F1dG9yID0gc3RyX3JlbW92ZV9hbGwoWDcwMCwiXFx8IikpICU+JQ0KICBzZWxlY3QoaWQsZHJ1Z2lfYXV0b3IpDQoNCmRydWdpX2F1dG9yIDwtIGJuX2tzICU+JQ0KICBmdWxsX2pvaW4oLixtYXJjX2ZpZWxkXzcwMCxieSA9ICJpZCIpICU+JQ0KICBzZWxlY3QoaWQsWDEwMCxYNzAwLGRydWdpX2F1dG9yKSAlPiUNCiAgZ3JvdXBfYnkoaWQpICU+JQ0KICBtdXRhdGUoWDEwMCA9IGlmZWxzZSghaXMubmEoZHJ1Z2lfYXV0b3IpLHN0cl9yZW1vdmUocGFzdGUoWDEwMCxwYXN0ZShkcnVnaV9hdXRvcixjb2xsYXBzZSA9ICJ8Iiksc2VwID0gInwiKSwiXlxcfCIpLGFzLmNoYXJhY3RlcihYMTAwKSksDQogICAgICAgICBkcnVnaV9hdXRvciA9IGxpc3QoZHJ1Z2lfYXV0b3IpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKQ0KICANCnggPC0gMTpsZW5ndGgoZHJ1Z2lfYXV0b3IkaWQpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIHkgPC0gMTpsZW5ndGhzKGRydWdpX2F1dG9yJGRydWdpX2F1dG9yW2ldKQ0KICBmb3IgKGogaW4geSkgew0KICAgIGRydWdpX2F1dG9yJFg3MDBbaV0gPC0gaWZlbHNlKGlzLm5hKGRydWdpX2F1dG9yJGRydWdpX2F1dG9yW2ldKSxhcy5jaGFyYWN0ZXIoZHJ1Z2lfYXV0b3IkWDcwMFtpXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoc3RyX3JlcGxhY2VfYWxsKHN0cl9yZXBsYWNlX2FsbChzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKGRydWdpX2F1dG9yJGRydWdpX2F1dG9yW2ldW1sxXV1bal0sIlxcXFwiLCJcXFxcXFxcXCIpLCJcXCQiLCJcXFxcJCIpLCJcXCgiLCJcXFxcKCIpLCJcXCkiLCJcXFxcKSIpLGRydWdpX2F1dG9yJFg3MDBbaV0pLHN0cl9yZW1vdmUoZHJ1Z2lfYXV0b3IkWDcwMFtpXSxzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKHN0cl9yZXBsYWNlX2FsbChzdHJfcmVwbGFjZV9hbGwoZHJ1Z2lfYXV0b3IkZHJ1Z2lfYXV0b3JbaV1bWzFdXVtqXSwiXFxcXCIsIlxcXFxcXFxcIiksIlxcJCIsIlxcXFwkIiksIlxcKCIsIlxcXFwoIiksIlxcKSIsIlxcXFwpIikpLGFzLmNoYXJhY3RlcihkcnVnaV9hdXRvciRYNzAwW2ldKSkpDQogIH0NCn0NCg0KZHJ1Z2lfYXV0b3IgPC0gZHJ1Z2lfYXV0b3IgJT4lDQogIG11dGF0ZShYNzAwID0gc3RyX3JlcGxhY2VfYWxsKFg3MDAsIihcXHwpKyIsInwiKSwNCiAgICAgICAgIFg3MDAgPSBzdHJfcmVtb3ZlKFg3MDAsIlxcfHwkIiksDQogICAgICAgICBYNzAwID0gaWZlbHNlKFg3MDA9PSJ8IiwiIixhcy5jaGFyYWN0ZXIoWDcwMCkpKSAlPiUNCiAgc2VsZWN0KGlkLFgxMDAsWDcwMCkNCmJuX2tzIDwtIGJuX2tzICU+JQ0KICBtdXRhdGUoWDEwMCA9IGRydWdpX2F1dG9yJFgxMDAsDQogICAgICAgICBYNzAwID0gZHJ1Z2lfYXV0b3IkWDcwMCkNCiMja29uaWVjIHByemVub3Npbg0KY2h1bmsxIDwtIGJuX2tzDQpgYGANCg0KYGBge3IgZ2VuZXJvd2FuaWUgbGlzdHkgemFwaXNvdyB6IG9zb2JhbWkgUEJMfQ0KYm5fa3MgPC0gY2h1bmsxDQojd2N6eXRhbmllIGxpc3R5IHV0b8W8c2FtaW9ueWNoIHR3w7NyY8OzdyB6IGF1dG9yYW1pIEJODQojYmV6cGllY3puaWs6IHXFvHnEhyBzaGVldHNfYXV0aCgpIHoga29uc29saQ0KcGJsX3ZpYWYgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMWNFejczZEdOMnIyLVRUYzcwMnluZTl0S2ZIOVBRNlV5QUoyekJTVjZKYjAiKSAlPiUNCiAgZmlsdGVyKGN6eV90ZW5fc2FtIT0ibmllIikgJT4lDQogIHNlbGVjdChwYmxfaWQsIEJOX2lkLCBCTl9uYW1lKSAlPiUNCiAgbXV0YXRlKEJOX25hbWUgPSBzdHJfcmVwbGFjZV9hbGwoQk5fbmFtZSwiXFx8XFwoIiwgIiAoIiksDQogICAgICAgICBCTl9uYW1lID0gc3RyX3JlcGxhY2VfYWxsKEJOX25hbWUsICJcXDtcXHwiLCAiOyAiKSkgJT4lDQogIGNTcGxpdCguLCJCTl9uYW1lIixzZXAgPSAifCIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKEJOX25hbWUhPSIiKQ0KcGJsX3ZpYWYyIDwtIHNoZWV0c19yZWFkKHNzID0gIjFfQmh3em8weHU0eVRuOHRGMFpOQVpxOWlJQXFJeGZjcmplTFZDbV9tZ2dNIikgJT4lDQogIGZpbHRlcihjenlfdGVuX3NhbSE9Im5pZSIpICU+JQ0KICBzZWxlY3QocGJsX2lkLCBCTl9pZCwgQk5fbmFtZSkgJT4lDQogIG11dGF0ZShCTl9uYW1lID0gc3RyX3JlcGxhY2VfYWxsKEJOX25hbWUsIlxcfFxcKCIsICIgKCIpLA0KICAgICAgICAgQk5fbmFtZSA9IHN0cl9yZXBsYWNlX2FsbChCTl9uYW1lLCAiXFw7XFx8IiwgIjsgIikpICU+JQ0KICBjU3BsaXQoLiwiQk5fbmFtZSIsc2VwID0gInwiLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihCTl9uYW1lIT0iIikNCnBibF92aWFmMyA8LSBzaGVldHNfcmVhZChzcyA9ICIxTC03WnY5RXlMcjVGZUNJWV9zOTByVDVIejZEakFTY0N4Nk54ZnVIdm9FUSIpICU+JQ0KICBmaWx0ZXIoY3p5X3Rlbl9zYW0hPSJuaWUiKSAlPiUNCiAgc2VsZWN0KHBibF9pZCwgQk5faWQsIEJOX25hbWUpICU+JQ0KICBtdXRhdGUoQk5fbmFtZSA9IHN0cl9yZXBsYWNlX2FsbChCTl9uYW1lLCJcXHxcXCgiLCAiICgiKSwNCiAgICAgICAgIEJOX25hbWUgPSBzdHJfcmVwbGFjZV9hbGwoQk5fbmFtZSwgIlxcO1xcfCIsICI7ICIpKSAlPiUNCiAgY1NwbGl0KC4sIkJOX25hbWUiLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoQk5fbmFtZSE9IiIpDQpwYmxfdmlhZiA8LSByYmluZChwYmxfdmlhZixwYmxfdmlhZjIsIHBibF92aWFmMykgJT4lDQogIGFycmFuZ2UocGJsX2lkKSAlPiUNCiAgdW5pcXVlKCkNCnJlbW92ZShwYmxfdmlhZjIpDQpyZW1vdmUocGJsX3ZpYWYzKQ0KDQojem9zdGF3acSHIGRvIHRlc3Rvd2FuaWEsIGN6eSBqZWRubyBoYXPFgm8gYm4gbmllIHphc2lsYSBraWxrdSBoYXNlxYIgdHfDs3Jjw7N3IHBibA0KI3BibF92aWFmIDwtIHNoZWV0c19yZWFkKHNzID0gIjFjRXo3M2RHTjJyMi1UVGM3MDJ5bmU5dEtmSDlQUTZVeUFKMnpCU1Y2SmIwIikgJT4lDQojICBmaWx0ZXIoY3p5X3Rlbl9zYW0hPSJuaWUiKSAlPiUNCiMgIHNlbGVjdChwYmxfaWQsIEJOX2lkLCBCTl9uYW1lKQ0KI3BibF92aWFmMiA8LSBzaGVldHNfcmVhZChzcyA9ICIxX0Jod3pvMHh1NHlUbjh0RjBaTkFacTlpSUFxSXhmY3JqZUxWQ21fbWdnTSIpICU+JQ0KIyAgZmlsdGVyKGN6eV90ZW5fc2FtIT0ibmllIikgJT4lDQojICBzZWxlY3QocGJsX2lkLCBCTl9pZCwgQk5fbmFtZSkNCiNwYmxfdmlhZiA8LSByYmluZChwYmxfdmlhZixwYmxfdmlhZjIpICU+JQ0KIyAgYXJyYW5nZShwYmxfaWQpICU+JQ0KIyAgdW5pcXVlKCkNCiMNCiNjb3VudCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHBibF92aWFmJEJOX2lkKSkNCiNwYmxfdmlhZiA8LSBtZXJnZShwYmxfdmlhZixjb3VudCxieS54ID0gIkJOX2lkIixieS55ID0gIlZhcjEiLGFsbC54ID0gVFJVRSkNCiNwYmxfdmlhZiA8LSBwYmxfdmlhZiAlPiUNCiMgIHVuaXF1ZSgpDQojY291bnQyIDwtIGFzLmRhdGEuZnJhbWUodGFibGUocGJsX3ZpYWYkcGJsX2lkKSkNCg0KI3V0b8W8c2FtaWFuaWUgcG8gbmF6ZXduaWN0d2llIHogaW5mb3JtYWNqxIUgbyBkemlhbGUNCnR3b3JjYV9pX2R6aWFsIDwtIGRiR2V0UXVlcnkoUEJMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IHR3LnR3X3R3b3JjYV9pZCBcInBibF9pZFwiLCBkei5kel9kemlhbF9pZHx8J3wnfHxkei5kel9uYXp3YSBcIm9zb2JhX3BibF9kemlhbF9pZF9uYW1lXCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gcGJsX3R3b3JjeSB0dw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbCBqb2luIHBibF9kemlhbHkgZHogb24gZHouZHpfZHppYWxfaWQ9dHcudHdfZHpfZHppYWxfaWQiKQ0KDQojbGlzdHkgbmF6d2lzayBCTiB6ZSB6YmlvcnUNCiMxMDANCm1hcmNfZmllbGRfMTAwIDwtIGJuX2tzICU+JQ0KICBzZWxlY3QoaWQsWDEwMCklPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlcGxhY2VfYWxsKFgxMDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDEwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZW1vdmVfYWxsKFgxMDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChibl9rcyRYMTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzEwMDwtY2JpbmQobWFyY19maWVsZF8xMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8xMDAkWDEwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzEwMCRYMTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzEwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzEwMCRYMTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8xMDAkWDEwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8xMDAgPC0gbWFyY19maWVsZF8xMDAgJT4lDQogIHNlbGVjdChpZCxgJGFgLGAkZGAsYCRjYCkgJT4lDQogIG11dGF0ZShuYW1lID0gaWZlbHNlKCFpcy5uYShgJGNgKSZzdWJzdHIoYCRjYCxuY2hhcihgJGNgKSxuY2hhcihgJGNgKSk9PSI7IixwYXN0ZShgJGFgLGAkY2AsYCRkYCxzZXAgPSAiICIpLGlmZWxzZSghaXMubmEoYCRkYCkscGFzdGUoYCRhYCxgJGRgLHNlcCA9ICIgIiksYXMuY2hhcmFjdGVyKGAkYWApKSkpICU+JQ0KICBzZWxlY3QoaWQsbmFtZSkgJT4lDQogIG11dGF0ZShuYW1lID0gc3RyX3JlcGxhY2UobmFtZSwiKFxcKSkoXFwuJCkiLCJcXDEiKSwNCiAgICAgICAgIG5hbWUgPSBzdHJfcmVwbGFjZShuYW1lLCAiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiLCJcXDEiKSkNCg0Kb3NvYmFfYm5fMTAwX3BibCA8LSBtYXJjX2ZpZWxkXzEwMCAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGlubmVyX2pvaW4oLixwYmxfdmlhZixieSA9IGMoIm5hbWUiID0gIkJOX25hbWUiKSkgJT4lDQogIHNlbGVjdCgxOjMpICU+JQ0KICBsZWZ0X2pvaW4oLix0d29yY2FfaV9kemlhbCxieSA9ICJwYmxfaWQiKSAlPiUNCiAgc2VsZWN0KGlkLG9zb2JhX3BibF9kemlhbF9pZF9uYW1lKSAlPiUNCiAgZ3JvdXBfYnkoaWQpICU+JQ0KICBtdXRhdGUob3NvYmFfYm5fYXV0b3IgPSBwYXN0ZSh1bmlxdWUob3NvYmFfcGJsX2R6aWFsX2lkX25hbWUpLGNvbGxhcHNlID0gIn4iKSkgJT4lDQogIHNlbGVjdCgtb3NvYmFfcGJsX2R6aWFsX2lkX25hbWUpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpDQoNCiM2MDANCm1hcmNfZmllbGRfNjAwIDwtIGJuX2tzICU+JQ0KICBzZWxlY3QoaWQsWDYwMCklPiUNCiAgZmlsdGVyKFg2MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2MDA9c3RyX3JlcGxhY2VfYWxsKFg2MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDYwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjAwIT0iIikgJT4lDQogIG11dGF0ZShYNjAwPXN0cl9yZW1vdmVfYWxsKFg2MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDYwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChibl9rcyRYNjAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzYwMDwtY2JpbmQobWFyY19maWVsZF82MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCg0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF82MDAkWDYwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzYwMCRYNjAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzYwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzYwMCRYNjAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF82MDAkWDYwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF82MDAgPC0gbWFyY19maWVsZF82MDAgJT4lDQogIHNlbGVjdChpZCxgJGFgLGAkZGAsYCRjYCkgJT4lDQogIG11dGF0ZShuYW1lID0gaWZlbHNlKCFpcy5uYShgJGNgKSZzdWJzdHIoYCRjYCxuY2hhcihgJGNgKSxuY2hhcihgJGNgKSk9PSI7IixwYXN0ZShgJGFgLGAkY2AsYCRkYCxzZXAgPSAiICIpLGlmZWxzZSghaXMubmEoYCRkYCkscGFzdGUoYCRhYCxgJGRgLHNlcCA9ICIgIiksYXMuY2hhcmFjdGVyKGAkYWApKSkpICU+JQ0KICBzZWxlY3QoaWQsbmFtZSkgJT4lDQogIG11dGF0ZShuYW1lID0gc3RyX3JlcGxhY2UobmFtZSwiKFxcKSkoXFwuJCkiLCJcXDEiKSwNCiAgICAgICAgIG5hbWUgPSBzdHJfcmVwbGFjZShuYW1lLCAiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiLCJcXDEiKSkNCm9zb2JhX2JuXzYwMF9wYmwgPC0gbWFyY19maWVsZF82MDAgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBpbm5lcl9qb2luKC4scGJsX3ZpYWYsYnkgPSBjKCJuYW1lIiA9ICJCTl9uYW1lIikpICU+JQ0KICBzZWxlY3QoMTozKSAlPiUNCiAgbGVmdF9qb2luKC4sdHdvcmNhX2lfZHppYWwsYnkgPSAicGJsX2lkIikgJT4lDQogIHNlbGVjdChpZCxvc29iYV9wYmxfZHppYWxfaWRfbmFtZSkgJT4lDQogIGdyb3VwX2J5KGlkKSAlPiUNCiAgbXV0YXRlKG9zb2JhX2JuX3RlbWF0ID0gcGFzdGUodW5pcXVlKG9zb2JhX3BibF9kemlhbF9pZF9uYW1lKSxjb2xsYXBzZSA9ICJ+IikpICU+JQ0KICBzZWxlY3QoLW9zb2JhX3BibF9kemlhbF9pZF9uYW1lKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKQ0KDQpibl9rcyA8LSBibl9rcyAlPiUNCiAgZnVsbF9qb2luKC4sb3NvYmFfYm5fMTAwX3BibCxieSA9ICJpZCIpICU+JQ0KICBmdWxsX2pvaW4oLixvc29iYV9ibl82MDBfcGJsLGJ5ID0gImlkIikNCg0KI2JlenBpZWN6bmlrIQ0KI3NwcmF3ZHppxIcNCiNqZcWbbGkgb2JpZWt0IGJlenBpZWN6bmlrIGLEmWR6aWUgbWlhxYIgamFraWVrb2x3aWVrIHdpZXJzemUsIHRvIG96bmFjemEsIMW8ZSB3IHBsaWt1ICJtYXBvd2FuaWVfb3NvYl9ibl9wYmwiIGplc3Qgd2llcnN6IHogdHfDs3JjxIUsIGt0w7NyZWdvIG5pZSBtYSB3IGJhemllIGx1YiBqZWdvIGlkZW50eWZpa2F0b3IgamVzdCBixYLEmWRueQ0KI2plxZtsaSBvYmlla3QgYmV6cGllY3puaWsgamVzdCBwdXN0eSAtIHRvIHdzenlzdGtvIG9rZWoNCiMgc3ByYXdkeiBjenkgaWQgdHdvcmN5IHoga3RvcmVqcyB0YWJlbGkgbmEgZHlza3UgaXN0bmllamUgdyBiYXppZSBvcmFjbGUsIGplc2xpIG5pZSwgd2tsZWogaWQgdHdvcmN5IHogb3JhY2xhIGRvIHRhYmVsaSBsdWIgLSBqZcWbbGkgbmllIG1hIHRha2llZ28gdHfDs3JjeSB3IGJhemllIHVzdcWEIHdpZXJzeiB3IHRhYmVsaS4gTmFzdMSZcG5pZSBkb3Bpc3ogZnJhZ21lbnQga29kdSwgYnkgdXN1bsSFxIcga29sdW1ueSBvc29iYV9ibl9hdXRvciBpIG9zb2JhX2JuX3RlbWF0IChwbyB0ZWogb3BlcmFjamkgdXN1xYQgZG9waXNhbnkga29kKSBpIHVydWNob20gY2h1bmsgcG9ub3duaWUNCg0KIyBibl9rcyA8LSBibl9rcyAlPiUgDQojICAgc2VsZWN0KC1vc29iYV9ibl9hdXRvciwtb3NvYmFfYm5fdGVtYXQpDQoNCmJlenBpZWN6bmlrIDwtIGJuX2tzICU+JSANCiAgZmlsdGVyKG9zb2JhX2JuX2F1dG9yPT0iTkEiKQ0KY2h1bmsyIDwtIGJuX2tzDQpgYGANCg0KYGBge3IgZGFsc3plIHByenlnb3Rvd2FuaWUgemJpb3J1IGRvIGltcG9ydHUgLSBVS0QsIHPFgm93YSBrbHVjem93ZSwgcG9sb25pa2l9DQojd3NrYXphbmllIGludGVyZXN1asSFY3ljaCBQQkwgZHppZWR6aW4gd2llZHp5IHBvIFVLRCBpIG9rcmXFm2xlbmllIHR5cHUgVUtEDQpibl9rcyA8LSBjaHVuazIgJT4lDQogIG11dGF0ZShkemllZHppbmFfUEJMID0gaWZlbHNlKHN0cl9kZXRlY3QoWDA4MCwiKD88PVxcJGF8OnxcXFt8XFwrfFxcKCkoODIpIiksInVrZF9saXQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChYMDgwLCIoPzw9XFwkYXw6fFxcW3xcXCspKDc5MSkiKXxzdHJfZGV0ZWN0KFgwODAsIig/PD1cXCRhfDopKDc5MikiKXxzdHJfZGV0ZWN0KFgwODAsIlxcJGE3XFwuMDkiKSwidWtkX3RmcnR2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KFgwODAsIig/PD1cXCRhMDEpKFxcKHxcXC98Mnw0fDV8OSkiKXxzdHJfZGV0ZWN0KFgwODAsIig/PD1cXCRhfFxcW10pKDA1MCkiKXxzdHJfZGV0ZWN0KFgwODAsIig/PD1cXCRhfDp8XFxbfFxcK3xcXCgpKDgxMVxcLjE2MikiKSwidWtkX2JpYmxpbyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoWDA4MCwiXFwkYTAwMiIpfHN0cl9kZXRlY3QoWDA4MCwiKD88PVxcJGF8OikoMzA1KSIpfHN0cl9kZXRlY3QoWDA4MCwiKD88PVxcJGEzOXw6MzkpKFxcKDQzOFxcKXw4XFwuMikiKXxzdHJfZGV0ZWN0KFgwODAsIig/PD1cXCRhfDopKDkyOVteXFwuXTA1MSkiKXxzdHJfZGV0ZWN0KFgwODAsIig/PD1cXCRhfDopKDkyOVteXFwuXTA1MikiKSwidWtkX3BvZ3JhbmljemUiLCJiZXpfdWtkX1BCTCIpKSkpKQ0KDQojb2dyYW5pY3plbmllIHJla29yZMOzdyB6IHVrZCBqxJl6eWtvd3ltDQpiaWJsaW8gPC0gYm5fa3MgJT4lIA0KICBzZWxlY3QoaWQsIFgwMDgsIFgwMDksIFgwMTUsIFgwNDEsIFgwNDQsIFgwODAsIFgxMDAsIFgyNDUsIFgyNDYsIFgyNTAsIFgyNjAsIFgzMDAsIFgzODAsIFgzODYsIFg0OTAsIFg1MDAsIFg1MDEsIFg1NDYsIFg2MDAsIFg2NTAsIFg2NTUsIFg3MDAsIFg3MTAsIFg4MDAsIFg4MzAsIHJvaywgQk5fVVJMLCBvc29iYV9ibl9hdXRvciwgb3NvYmFfYm5fdGVtYXQsIGR6aWVkemluYV9QQkwpICU+JSANCiAgZmlsdGVyKGR6aWVkemluYV9QQkw9PSJ1a2RfYmlibGlvIikNCmRvYnJlX2JpYmxpbyA8LSBiaWJsaW8gJT4lIA0KICBmaWx0ZXIoIWdyZXBsKCJQb2RyxJljem5pa2kgZGxhIGR6aWVjaXxQb2RyxJljem5pa2kgZGxhIHN6a8OzxYIgcG9kc3Rhd293eWNoIixYNjU1KSwNCiAgICAgICAgICFncmVwbCgic3prb8WCeSBwb2RzdGF3b3dlfHJvem3Ds3draXxuYXVjemFuaWV8bG9nb3BlZGlhIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksDQogICAgICAgICAhZ3JlcGwoIjgxMVxcLjE2MlxcLjFcXCgwNzVcXC4yXFwpfDgxMVxcLjE2MlxcJzI0XFwoMDc4XFwpIixYMDgwKSwNCiAgICAgICAgICFncmVwbCgixId3aWN6ZW5pYSBpIHphZGFuaWF8cG9yYWRuaWtpIGRsYSBuYXVjenljaWVsaXxzxYJvd25pay4qP1xcLXBvbHNraXxzxYJvd25payBwb2xza29cXC18U8WCb3duaWtpIGRsYSBkemllY2kiLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKSwNCiAgICAgICAgICEoZ3JlcGwoIlBvZHLEmWN6bmlraSIsWDY1NSkmZ3JlcGwoIktzenRhxYJjZW5pZSBuYXVjenljaWVsaSIsWDY1MCkpKQ0KZG9icmVfYmlibGlvMiA8LSBiaWJsaW8gJT4lIA0KICBmaWx0ZXIoIShpcy5uYShvc29iYV9ibl9hdXRvcikmaXMubmEob3NvYmFfYm5fdGVtYXQpKSkNCmRvYnJlX2JpYmxpbyA8LSBkb2JyZV9iaWJsaW8gJT4lIA0KICBiaW5kX3Jvd3MoZG9icmVfYmlibGlvMiAlPiUgZmlsdGVyKGlkICVub3RpbiUgZG9icmVfYmlibGlvJGlkKSkNCnpsZV9iaWJsaW8gPC0gYmlibGlvICU+JSANCiAgZmlsdGVyKGlkICVub3RpbiUgZG9icmVfYmlibGlvJGlkKQ0KYm5fa3MkZHppZWR6aW5hX1BCTFtibl9rcyRpZCAlaW4lIHpsZV9iaWJsaW8kaWRdIDwtIE5BDQoNCiN3c2themFuaWUgaW50ZXJlc3VqxIVjeWNoIFBCTCByZWtvcmTDs3cgYmV6IFVLRCwga3TDs3JlIHPEhSB3IGtsdWN6dSBQQkwNCmJlel91a2RfYWxlX1BCTCA8LSBibl9rcyAlPiUNCiAgc2VsZWN0KGlkLCBYMDgwLCBYNjUwLCBYNjU1LCBvc29iYV9ibl9hdXRvciwgb3NvYmFfYm5fdGVtYXQsIGR6aWVkemluYV9QQkwpICU+JQ0KICBmaWx0ZXIoZHppZWR6aW5hX1BCTCA9PSAiYmV6X3VrZF9QQkwiJlgwODA9PSIiJmlzLm5hKG9zb2JhX2JuX2F1dG9yKSZpcy5uYShvc29iYV9ibl90ZW1hdCkpICU+JQ0KICBtdXRhdGUoYmV6X3VrZF9hbGVfUEJMID0gZ3JlcGwoImxpdGVyYXR8bGl0ZXJhY3xwaXNhcnxiYWprfGRyYW1hdHxlcGlncmFtYXR8ZXNlanxmZWxpZXRvbnxmaWxtfGtvbWVkaXxub3dlbHxvcG93aWFkYW5pfHBhbWnEmXRuaWt8cG9lbWlrc3xwb2V6anxwb3dpZcWbxId8cHJvemF8cmVwb3J0YcW8fHNhdHlyfHdzcG9tbmllbml8U2NlbmFyaXVzemUgemFqxJnEh3xQb2RyxJljem5pa2kgZGxhIGdpbW5hemrDs3d8dGVhdHJ8TmFncm9kfGFmb3J5em18YmHFm8WEfGJhxZtuaWV8cG9sb25pam58ZGlhbG9naXxmYW50YXN0eWthIG5hdWtvd2F8bGVnZW5kfHBpZcWbxYR8cG9lbWF0fHByenlwb3dpZcWbfGhvbm9yaXMgY2F1c2F8Zmlsb2xvZ2l8a2lubyBwb2xza2llfHBpZcWbbml8aW50ZXJwcmV0YWNqIixYNjUwLCBpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJsaXRlcmF0fGxpdGVyYWN8cGlzYXJ8YmFqa3xkcmFtYXR8ZXBpZ3JhbWF0fGVzZWp8ZmVsaWV0b258ZmlsbXxrb21lZGl8bm93ZWx8b3Bvd2lhZGFuaXxwYW1pxJl0bmlrfHBvZW1pa3N8cG9lemp8cG93aWXFm8SHfHByb3phfHJlcG9ydGHFvHxzYXR5cnx3c3BvbW5pZW5pfFNjZW5hcml1c3plIHphasSZxId8UG9kcsSZY3puaWtpIGRsYSBnaW1uYXpqw7N3fHRlYXRyfE5hZ3JvZHxhZm9yeXptfGJhxZvFhHxiYcWbbmllfHBvbG9uaWpufGRpYWxvZ2l8ZmFudGFzdHlrYSBuYXVrb3dhfGxlZ2VuZHxwaWXFm8WEfHBvZW1hdHxwcnp5cG93aWXFm3xob25vcmlzIGNhdXNhfGZpbG9sb2dpfGtpbm8gcG9sc2tpZXxwaWXFm25pfGludGVycHJldGFjaiIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpKSAlPiUNCiAgZmlsdGVyKGJlel91a2RfYWxlX1BCTCA9PSBUUlVFKSAlPiUNCiAgc2VsZWN0KGlkKSAlPiUNCiAgbXV0YXRlKGJlel91a2RfYWxlX1BCTCA9ICJ0YWsiKQ0KDQpibl9rcyA8LSBibl9rcyAlPiUNCiAgZnVsbF9qb2luKC4sYmV6X3VrZF9hbGVfUEJMLGJ5ID0gImlkIikNCg0KI0JpYmxpYQ0KYmlibGlhIDwtIGJuX2tzICU+JSANCiAgZmlsdGVyKGdyZXBsKCJiaWJsaWEiLCBYNjMwLCBpZ25vcmUuY2FzZSA9IFRSVUUpLCANCiAgICAgICAgIGdyZXBsKCJhbmFsaXphIGkgaW50ZXJwcmV0YWNqYXxlZHljamEga3J5dHljem5hfG1hdGVyaWHFgnkga29uZmVyZW5jeWpuZSIsIFg2NTUsIGlnbm9yZS5jYXNlID0gVFJVRSkpICU+JSANCiAgc2VsZWN0KGlkKSAlPiUgDQogIG11dGF0ZShjenlfYmlibGlhID0gInRhayIpDQoNCmJuX2tzIDwtIGJuX2tzICU+JQ0KICBmdWxsX2pvaW4oYmlibGlhLGJ5ID0gImlkIikNCg0KI3dzcG9tbmllbmlhLHBhbWnEmXRuaWtpLGxpdGVyYXR1cmEgcG9kcsOzxbxuaWN6YSxyZXBvcnRhxbwNCndzcG9tbmllbmlhIDwtIGJuX2tzICU+JQ0KICBtdXRhdGUoY3p5X3dzcG9tbmllbmlhX3JlcG9ydGF6ID0gaWZlbHNlKHN0cl9kZXRlY3QoWDY1NSwiUGFtacSZdG5pa2kgaSB3c3BvbW5pZW5pYSIpfHN0cl9kZXRlY3QoWDY1NSwiTGl0ZXJhdHVyYSBwb2Ryw7PFvG5pY3phIil8c3RyX2RldGVjdChYNjU1LCJQYW1pxJl0bmlraSIpfHN0cl9kZXRlY3QoWDY1NSwiUmVwb3J0YcW8Iil8c3RyX2RldGVjdChYNjU1LCJSZWxhY2phIHogcG9kcsOzxbx5IiksInRhayIsTkEpKSAlPiUNCiAgc2VsZWN0KGlkLGN6eV93c3BvbW5pZW5pYV9yZXBvcnRheikgJT4lDQogIHVuaXF1ZSgpDQpibl9rcyA8LSBibl9rcyAlPiUNCiAgZnVsbF9qb2luKC4sd3Nwb21uaWVuaWEsYnkgPSAiaWQiKQ0KDQojc8WCb3dhIGxpdGVyYWNraWUgdyBwb2x1IDI0NQ0KcmVrb3JkeV9zbG93YSA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgZnJvbSBibl9rcyBhDQogICAgICAgICAgICAgICAgICAgIHdoZXJlIExPV0VSKGEuWDI0NSkgbGlrZSAoJyUnfHwncGlzYXInfHwnJScpDQogICAgICAgICAgICAgICAgICAgb3IgTE9XRVIoYS5YMjQ1KSBsaWtlICgnJSd8fCdsaXRlcmF0J3x8JyUnKQ0KICAgICAgICAgICAgICAgICAgIG9yIExPV0VSKGEuWDI0NSkgbGlrZSAoJyUnfHwnbGl0ZXJhYyd8fCclJykNCiAgICAgICAgICAgICAgICAgICBvciBMT1dFUihhLlgyNDUpIGxpa2UgKCclJ3x8J3RlYXRyJ3x8JyUnKQ0KICAgICAgICAgICAgICAgICAgIG9yIExPV0VSKGEuWDI0NSkgbGlrZSAoJyUnfHwnZmlsbSd8fCclJykNCiAgICAgICAgICAgICAgICAgICBvciBMT1dFUihhLlgyNDUpIGxpa2UgKCclJ3x8J2RyYW1hdCd8fCclJykNCiAgICAgICAgICAgICAgICAgICBvciBMT1dFUihhLlgyNDUpIGxpa2UgKCclJ3x8J2ludGVycHJldGFjaid8fCclJykiKSAlPiUNCiAgc2VsZWN0KGlkKSAlPiUNCiAgbXV0YXRlKHNsb3dhX2xpdGVyYWNraWUgPSAidGFrIikgJT4lDQogIHVuaXF1ZSgpDQpibl9rcyA8LSBibl9rcyAlPiUNCiAgZnVsbF9qb2luKC4scmVrb3JkeV9zbG93YSxieSA9ICJpZCIpDQoNCmJuX29rIDwtIGJuX2tzICU+JQ0KICBmaWx0ZXIoISgoaXMubmEob3NvYmFfYm5fYXV0b3IpJmlzLm5hKG9zb2JhX2JuX3RlbWF0KSkmZHppZWR6aW5hX1BCTD09ImJlel91a2RfUEJMIiZpcy5uYShiZXpfdWtkX2FsZV9QQkwpJmlzLm5hKGN6eV93c3BvbW5pZW5pYV9yZXBvcnRheikmaXMubmEoc2xvd2FfbGl0ZXJhY2tpZSkmaXMubmEoY3p5X2JpYmxpYSkpKQ0KDQojaW50ZXJwcmV0YWNqZSBuaWVsaXRlcmFja2llDQp6bGVfaW50ZXJwcmV0YWNqZSA8LSBibl9vayAlPiUgDQogIGZpbHRlcihncmVwbCgiaW50ZXJwcmV0YWNqIixYMjQ1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoImludGVycHJldGFjaiIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJpbnRlcnByZXRhY2oiLFgyNDUsaWdub3JlLmNhc2UgPSBUUlVFKSkgJT4lIA0KICBmaWx0ZXIoZ3JlcGwoIlxcJGEzMzZ8XFwkYTM0MnxcXCRhMzJ8XFwkYTU1MXxcXCRhNjE2fFxcJGExNTlcXC45NjEiLFgwODApfGdyZXBsKCJwcmF3bnxoYW5kbHxoYW5kZWx8a29kZWtzfHByYWN8dXN0YXd8YWRtaW5pc3RyYWN8c3DDs8WCa2F8c3DDs8WCZWt8cHJhd2F8cG9kYXRrIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoInByYXdufGhhbmRsfGhhbmRlbHxrb2Rla3N8cHJhY3x1c3Rhd3xhZG1pbmlzdHJhY3xzcMOzxYJrYXxzcMOzxYJla3xwcmF3YXxwb2RhdGsiLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgicHJhd258aGFuZGx8aGFuZGVsfGtvZGVrc3x1c3Rhd3xhZG1pbmlzdHJhY3xzcMOzxYJrYXxzcMOzxYJla3xwcmF3YXxwb2RhdGsiLFgyNDUsaWdub3JlLmNhc2UgPSBUUlVFKSkNCg0KYm5fb2sgPC0gYm5fb2sgJT4lIA0KICBmaWx0ZXIoaWQgJW5vdGluJSB6bGVfaW50ZXJwcmV0YWNqZSRpZCkNCg0KI3VzdXdhbmllIHpkdWJsb3dhbnljaCBrc2nEhcW8ZWsNCiMwMjANCm1hcmNfZmllbGRfMDIwIDwtIGJuX29rICU+JQ0KICBzZWxlY3QoaWQsWDAyMCklPiUNCiAgZmlsdGVyKFgwMjAhPSIiKSAlPiUNCiAgbXV0YXRlKFgwMjA9c3RyX3JlcGxhY2VfYWxsKFgwMjAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDAyMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMDIwIT0iIikgJT4lDQogIG11dGF0ZShYMDIwPXN0cl9yZW1vdmVfYWxsKFgwMjAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDAyMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChibl9vayRYMDIwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMDIwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzAyMDwtY2JpbmQobWFyY19maWVsZF8wMjAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8wMjAkWDAyMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzAyMCRYMDIwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzAyMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzAyMCRYMDIwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8wMjAkWDAyMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8wMjAgPC0gbWFyY19maWVsZF8wMjAgJT4lDQogIHNlbGVjdChpZCxpc2JuPWAkYWApDQoNCmRpc3RhbmNlMSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKCFncmVwbCgiXFwkbiIsWDI0NSkpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzAyMCxieT0iaWQiKSAlPiUNCiAgbXV0YXRlKHBvcm93bmFuaWUgPSBwYXN0ZShpc2JuLHN1YnN0cihzdHJfdG9fbG93ZXIoc3RyX3JlcGxhY2VfYWxsKFgyNDUsICJcXFciLCAiIikpLDQsMTQpLHN0cl9leHRyYWN0KFgzMDAsIig/PD1cXCRhKSguKj8pKD89LHwgKSIpLHNlcCA9ICJ8IikpDQoNCmNvdW50IDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZGlzdGFuY2UxJHBvcm93bmFuaWUpKQ0KDQpkaXN0YW5jZTEgPC0gbWVyZ2UoZGlzdGFuY2UxLGNvdW50LGJ5LnggPSAicG9yb3duYW5pZSIsYnkueSA9ICJWYXIxIixhbGwueCA9IFRSVUUpICU+JQ0KICBzZWxlY3QocG9yb3duYW5pZSxGcmVxLDI6MTU1KSAlPiUNCiAgYXJyYW5nZSgtRnJlcSxwb3Jvd25hbmllKSAlPiUNCiAgc2VsZWN0KHBvcm93bmFuaWUsRnJlcSxpZCkgJT4lDQogIGNTcGxpdCguLCJwb3Jvd25hbmllIixzZXAgPSAifCIsZGlyZWN0aW9uID0gIndpZGUiKSAlPiUgDQogIGFycmFuZ2UocG9yb3duYW5pZV8yLHBvcm93bmFuaWVfMyxwb3Jvd25hbmllXzEsLUZyZXEsaWQpDQpjb3VudCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRpc3RhbmNlMSRwb3Jvd25hbmllXzIsZGlzdGFuY2UxJHBvcm93bmFuaWVfMykpICU+JSANCiAgZmlsdGVyKEZyZXE+MCkNCmRpc3RhbmNlMSA8LSBkaXN0YW5jZTEgJT4lIA0KICBsZWZ0X2pvaW4oLixjb3VudCxieT1jKCJwb3Jvd25hbmllXzIiPSJWYXIxIiwicG9yb3duYW5pZV8zIj0iVmFyMiIpKSAlPiUgDQogIGFycmFuZ2UocG9yb3duYW5pZV8yLHBvcm93bmFuaWVfMywtRnJlcS55LHBvcm93bmFuaWVfMSwtRnJlcS55LGlkKSAlPiUgDQogIGdyb3VwX2J5X2F0KHZhcnMoNDo2KSkgJT4lIA0KICBmaWxsKHBvcm93bmFuaWVfMSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICB1bmlxdWUoKSAlPiUgDQogIHNlbGVjdCgtRnJlcS55KSAlPiUgDQogIHJlbmFtZShGcmVxID0gRnJlcS54KQ0KDQojcG9zenVrYW5pZSBkeXN0YW5zdSBMZXZlbnNodGVpbmEgPT0gMSBwcnp5IHRha2ltIHNhbXltIElTQk4NCmRpc3RhbmNlMiA8LSBkaXN0YW5jZTEgJT4lDQogIGZpbHRlcighaXMubmEocG9yb3duYW5pZV8xKSkgJT4lDQogIGdyb3VwX2J5KHBvcm93bmFuaWVfMSkgJT4lDQogIG11dGF0ZShGcmVxID0gcGFzdGUoRnJlcSxjb2xsYXBzZSA9ICJ8IiksDQogICAgICAgICBpZCA9IHBhc3RlKGlkLGNvbGxhcHNlID0gInwiKSwNCiAgICAgICAgIHBvcm93bmFuaWVfMiA9IHBhc3RlKHBvcm93bmFuaWVfMixjb2xsYXBzZSA9ICJ8IiksDQogICAgICAgICBwb3Jvd25hbmllXzMgPSBwYXN0ZShwb3Jvd25hbmllXzMsY29sbGFwc2UgPSAifCIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKGlsZSA9IHN0cl9jb3VudChwb3Jvd25hbmllXzIsIlxcfCIpKzEpICU+JQ0KICBhcnJhbmdlKC1pbGUpICU+JQ0KICBtdXRhdGUoaWRfZ3J1cHkgPSAxOmxlbmd0aHMoLikpICU+JQ0KICBmaWx0ZXIoaWxlPjEpICU+JQ0KICBjU3BsaXQoLixjKCJGcmVxIiwiaWQiLCJwb3Jvd25hbmllXzIiLCJwb3Jvd25hbmllXzMiKSxzZXAgPSAifCIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGZpbHRlcighaXMubmEoaWQpKQ0KDQpwZXJtdXRhdGlvbnMgPC0gZGF0YS5mcmFtZShzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQp4IDwtIDE6bWF4KGRpc3RhbmNlMiRpZF9ncnVweSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgZGlzdGFuY2UzIDwtIGFzLnZlY3Rvcih1bmxpc3QoZGlzdGFuY2UyICU+JSBmaWx0ZXIoaWRfZ3J1cHk9PWkpICU+JSBzZWxlY3QocG9yb3duYW5pZV8yKSkpDQogIGl0ZXJhdGlvbiA8LSBhcy5kYXRhLmZyYW1lKHBlcm11dGF0aW9ucyhkaXN0YW5jZTMsMikpICU+JQ0KICAgIG11dGF0ZShpZF9ncnVweSA9IGkpDQogIHkgPC0gMTpsZW5ndGgoaXRlcmF0aW9uJFYxKQ0KICBmb3IgKGogaW4geSkgew0KICAgIHByb2dyZXNzKG1hdGNoKGoseSksIG1heC52YWx1ZSA9IGxlbmd0aCh5KSkNCiAgICBpdGVyYXRpb24kZGlzdGFuY2Vbal0gPC0gYWRpc3QoaXRlcmF0aW9uJFYxW2pdLGl0ZXJhdGlvbiRWMltqXSkNCiAgfQ0KICBwZXJtdXRhdGlvbnMgPC0gcmJpbmQocGVybXV0YXRpb25zLGl0ZXJhdGlvbikNCn0NCg0KcGVybXV0YXRpb25zIDwtIHBlcm11dGF0aW9ucyAlPiUNCiAgZmlsdGVyKGRpc3RhbmNlPD0xKQ0KDQpkaXN0YW5jZTIgPC0gZGlzdGFuY2UyICU+JQ0KICBmaWx0ZXIoaWRfZ3J1cHkgJWluJSBwZXJtdXRhdGlvbnMkaWRfZ3J1cHkpICU+JQ0KICBzZWxlY3QoaWQsaWRfZ3J1cHkpDQojcG/FgsSFY3p5xIcgZGlzdGFuY2UyIHogZGlzdGFuY2UxLCDFvGVieSB3eWRvYnnEhyBwZcWCbsSFIGxpc3TEmSB6ZHVibG93YW55Y2gga3NpxIXFvGVrDQpkdWJsZV9rc2lhemVrIDwtIGRpc3RhbmNlMSAlPiUNCiAgdW5pdGUoInBvcm93bmFuaWUiLCBwb3Jvd25hbmllXzE6cG9yb3duYW5pZV8zLCBzZXAgPSAifCIpICU+JQ0KICBmaWx0ZXIoRnJlcT4xKSAlPiUNCiAgZnVsbF9qb2luKC4sZGlzdGFuY2UyLGJ5PSJpZCIpDQoNCmR1YmxlX2tzaWF6ZWskc2FtZSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoZHVibGVfa3NpYXplayRwb3Jvd25hbmllKSkNCg0KZHVibGVfa3NpYXplayA8LSBkdWJsZV9rc2lhemVrICU+JQ0KICBhcnJhbmdlKGlkX2dydXB5LHNhbWUpICU+JQ0KICBtdXRhdGUoaWRfZ3J1cHlfZHVibGkgPSBpZmVsc2UoIWlzLm5hKGlkX2dydXB5KSxhcy5jaGFyYWN0ZXIoaWRfZ3J1cHkpLHBhc3RlKCJ4IixzYW1lLHNlcCA9ICIiKSkpICU+JQ0KICBzZWxlY3QoaWQsaWRfZ3J1cHlfZHVibGkpICU+JQ0KICBhcnJhbmdlKGlkX2dydXB5X2R1YmxpKQ0KDQpkdWJsZV9rc2lhemVrJGlkX2dydXB5X2R1YmxpIDwtIGN1bXN1bSghZHVwbGljYXRlZChkdWJsZV9rc2lhemVrJGlkX2dydXB5X2R1YmxpKSkNCiN1enVwZcWCbmllbmllIGNhxYJlZ28gemJpb3J1IG8gaW5mb3JtYWNqxJkgbyBkdWJsdSwgd3lkb2J5Y2llIGR1YmxpIGRvIG9zb2JuZWdvIHBsaWt1IGkgdXN1bmllY2llIGljaCB6IGfFgsOzd25lZ28gcGxpa3UgeiByZWtvcmRhbWkgYm47IHdza2F6YW5pZSBsaXN0eSBpbnRlcmVzdWrEhWN5Y2ggcMOzbA0KYm5fb2sgPC0gYm5fb2sgJT4lDQogIGxlZnRfam9pbiguLGR1YmxlX2tzaWF6ZWssYnk9ImlkIikgJT4lDQogIHNlbGVjdChpZCwgWDAwOCwgWDAwOSwgWDAxNSwgWDA0MSwgWDA0NCwgWDA4MCwgWDEwMCwgWDI0NSwgWDI0NiwgWDI1MCwgWDI2MCwgWDMwMCwgWDM4MCwgWDM4NiwgWDQ5MCwgWDUwMCwgWDUwMSwgWDU0NiwgWDYwMCwgWDY1MCwgWDY1NSwgWDcwMCwgWDcxMCwgWDgwMCwgWDgzMCwgcm9rLCBCTl9VUkwsIG9zb2JhX2JuX2F1dG9yLCBvc29iYV9ibl90ZW1hdCwgZHppZWR6aW5hX1BCTCwgYmV6X3VrZF9hbGVfUEJMLCBjenlfd3Nwb21uaWVuaWFfcmVwb3J0YXosIHNsb3dhX2xpdGVyYWNraWUsIGN6eV9iaWJsaWEsIGlkX2dydXB5X2R1YmxpKQ0KDQpkdWJsZV9rc2lhemVrIDwtIGJuX29rICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGlkX2dydXB5X2R1YmxpKSkgJT4lDQogIGFycmFuZ2UoaWRfZ3J1cHlfZHVibGkpDQoNCmJuX29rIDwtIGJuX29rICU+JQ0KICBmaWx0ZXIoaXMubmEoaWRfZ3J1cHlfZHVibGkpKQ0KI3dwaXNhbmllIHcgemR1Ymxvd2FuZSByZWtvcmR5IGphayBuYWp3acSZa3N6ZWogaWxvxZtjaSBkYW55Y2ggKHN1bWEgd3N6eXN0a2ljaCBkdWJsaSkNCmR1YmxlX2tzaWF6ZWsgPC0gZHVibGVfa3NpYXplayAlPiUNCiAgYXJyYW5nZShpZF9ncnVweV9kdWJsaSwtbmNoYXIoWDAxNSkpDQpkdWJsZV9rc2lhemVrW2lzLm5hKGR1YmxlX2tzaWF6ZWspXSA8LSAiIg0KZHVibGVfbmFwcmF3aW9uZSA8LSBkYXRhLmZyYW1lKHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCnggPC0gMTptYXgoZHVibGVfa3NpYXplayRpZF9ncnVweV9kdWJsaSkNCnkgPC0gYyg0OjI3LDI5OjM0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBpdGVyYXRpb24gPC0gZHVibGVfa3NpYXplayAlPiUNCiAgICBmaWx0ZXIoaWRfZ3J1cHlfZHVibGk9PWkpDQogIGZvciAoaiBpbiB5KSB7DQogICAgaWYgKGo9PTMwKSB7DQogICAgICBpdGVyYXRpb25bLGpdIDwtIGl0ZXJhdGlvblssal1bbmNoYXIoaXRlcmF0aW9uWyxqXSk9PW1pbihuY2hhcihpdGVyYXRpb25bLGpdKSldWzFdDQogICAgfSBlbHNlIHsNCiAgICAgICAgaXRlcmF0aW9uWyxqXSA8LSBpdGVyYXRpb25bLGpdW25jaGFyKGl0ZXJhdGlvblssal0pPT1tYXgobmNoYXIoaXRlcmF0aW9uWyxqXSkpXVsxXQ0KICAgICAgfQ0KICB9DQogIGR1YmxlX25hcHJhd2lvbmUgPC0gcmJpbmQoZHVibGVfbmFwcmF3aW9uZSxpdGVyYXRpb24pDQp9DQojcG96b3N0YXdpZW5pZSBwb2plZHluY3p5Y2ggd2llcnN6eSBkbGEga3NpxIXFvGVrDQpkdWJsZV9uYXByYXdpb25lIDwtIGR1YmxlX25hcHJhd2lvbmVbIWR1cGxpY2F0ZWQoZHVibGVfbmFwcmF3aW9uZSRpZF9ncnVweV9kdWJsaSksXQ0KZHVibGVfbmFwcmF3aW9uZSA8LSBkdWJsZV9uYXByYXdpb25lICU+JQ0KICBtdXRhdGUob3NvYmFfYm5fYXV0b3IgPSBpZmVsc2Uob3NvYmFfYm5fYXV0b3IhPSIiLGFzLmNoYXJhY3Rlcihvc29iYV9ibl9hdXRvciksTkEpLA0KICAgICAgICAgb3NvYmFfYm5fdGVtYXQgPSBpZmVsc2Uob3NvYmFfYm5fdGVtYXQhPSIiLGFzLmNoYXJhY3Rlcihvc29iYV9ibl90ZW1hdCksTkEpLA0KICAgICAgICAgZHppZWR6aW5hX1BCTCA9IGlmZWxzZShkemllZHppbmFfUEJMIT0iIixhcy5jaGFyYWN0ZXIoZHppZWR6aW5hX1BCTCksTkEpLA0KICAgICAgICAgYmV6X3VrZF9hbGVfUEJMID0gaWZlbHNlKGJlel91a2RfYWxlX1BCTCE9IiIsYXMuY2hhcmFjdGVyKGJlel91a2RfYWxlX1BCTCksTkEpLA0KICAgICAgICAgY3p5X3dzcG9tbmllbmlhX3JlcG9ydGF6ID0gaWZlbHNlKGN6eV93c3BvbW5pZW5pYV9yZXBvcnRheiE9IiIsYXMuY2hhcmFjdGVyKGN6eV93c3BvbW5pZW5pYV9yZXBvcnRheiksTkEpLA0KICAgICAgICAgc2xvd2FfbGl0ZXJhY2tpZSA9IGlmZWxzZShzbG93YV9saXRlcmFja2llIT0iIixhcy5jaGFyYWN0ZXIoc2xvd2FfbGl0ZXJhY2tpZSksTkEpLCkNCiNwb8WCxIVjemVuaWUgdW5pa2F0b3d5Y2gga3NpxIXFvGVrIHogZHVibGkgeiBjYcWCeW0gemJpb3JlbQ0KYm5fb2sgPC0gYm5fb2sgJT4lDQogIGJpbmRfcm93cyguLGR1YmxlX25hcHJhd2lvbmUpICU+JQ0KICBzZWxlY3QoLWlkX2dydXB5X2R1YmxpKQ0KDQojdXN1bmnEmWNpZSB6YWdyYW5pY3pueWNoIHphcGlzw7N3LCBrdMOzcmUgbmllIHPEhSBwb2xvbmlrYW1pIA0KI25hIHBvZHN0YXdpZSBicmFrdSB3eXN0xIVwaWXFhCBmcmF6eSAicG9sIiB3IHBvbGFjaCBNQVJDDQpuaWVfcG9sb25pa2kgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihpZiAoWDUwMT09IiIpICFncmVwbCgicGwiLHN1YnN0cihYMDA4LDE2LDE4KSkpICU+JQ0KICBmaWx0ZXIoIWdyZXBsKCJwb2wiLHN1YnN0cihYMDA4LDM2LDM4KSkpICU+JQ0KICBmaWx0ZXIoIWdyZXBsKCJwb2wiLFgwNDEpKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgicGwiLFgwNDQpKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgicG9sIixYNTAwLGlnbm9yZS5jYXNlID0gVFJVRSkpICU+JQ0KICBmaWx0ZXIoIWdyZXBsKCJwb2wiLFg1MDEsaWdub3JlLmNhc2UgPSBUUlVFKSkgJT4lDQogIGZpbHRlcighZ3JlcGwoInBvbCIsWDU0NixpZ25vcmUuY2FzZSA9IFRSVUUpKSAlPiUNCiAgc2VsZWN0KGlkKSAlPiUNCiAgbXV0YXRlKGN6eV9wb2xvbmlrID0gIm5pZSIpICU+JQ0KICB1bmlxdWUoKQ0KDQpibl9vayA8LSBibl9vayAlPiUNCiAgZnVsbF9qb2luKC4sbmllX3BvbG9uaWtpLGJ5ID0gImlkIikgJT4lDQogIHNlbGVjdChpZCwgWDAwOCwgWDAwOSwgWDA0MSwgWDA0NCwgWDA4MCwgWDEwMCwgWDI0NSwgWDI0NiwgWDI1MCwgWDI2MCwgWDMwMCwgWDM4MCwgWDM4NiwgWDQ5MCwgWDUwMCwgWDUwMSwgWDUwMCwgWDU0NiwgWDYwMCwgWDY1MCwgWDY1NSwgWDcwMCwgWDcxMCwgWDgwMCwgWDgzMCwgcm9rLCBCTl9VUkwsIG9zb2JhX2JuX2F1dG9yLCBvc29iYV9ibl90ZW1hdCwgZHppZWR6aW5hX1BCTCwgYmV6X3VrZF9hbGVfUEJMLCBjenlfd3Nwb21uaWVuaWFfcmVwb3J0YXosIHNsb3dhX2xpdGVyYWNraWUsIGN6eV9wb2xvbmlrLCBjenlfYmlibGlhKSAlPiUNCiAgdW5pcXVlKCkNCiN3c2themFuaWUgbmllcG9sb25pa8OzdyBpIHVzdW5pxJljaWUgemUgemJpb3J1DQpuaWVfcG9sb25pa2kgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihjenlfcG9sb25paz09Im5pZSIpICU+JQ0KICBmaWx0ZXIoaXMubmEob3NvYmFfYm5fYXV0b3IpfGlzLm5hKG9zb2JhX2JuX3RlbWF0KXwhKG9zb2JhX2JuX2F1dG9yICVpbiUgYygiMTQ4fEhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkiLCI0MzB8SGFzxYJhIG9zb2Jvd2UgKEx1ZHppZSB0ZWF0cnUgaSBmaWxtdSkiKSl8IShvc29iYV9ibl90ZW1hdCAlaW4lIGMoIjE0OHxIYXPFgmEgb3NvYm93ZSAobGl0ZXJhdHVyYSBwb2xza2EpIiwiNDMwfEhhc8WCYSBvc29ib3dlIChMdWR6aWUgdGVhdHJ1IGkgZmlsbXUpIikpKQ0KYm5fb2sgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICBmcm9tIGJuX29rIGENCiAgICAgICAgICAgICAgIHdoZXJlIGEuaWQgbm90IGluIChzZWxlY3QgYi5pZCBmcm9tIG5pZV9wb2xvbmlraSBiKSIpICU+JQ0KICBzZWxlY3QoLWN6eV9wb2xvbmlrKQ0KDQojdXN1bmnEmWNpZSBrc2nEhcW8ZWsgemFiYXdlaywgZG8ga29sb3Jvd2FuaWEsIGRsYSBtYcWCeWNoIGR6aWVjaSwgeiBuYWtsZWprYW1pLCBrdMOzcmUgbmllIG1hasSFIMW8YWRuZWdvIGRlc2tyeXB0b3JhIGdhdHVua293ZWdvDQprc196YWJhd2tpIDwtIGJuX29rICU+JSANCiAgZmlsdGVyKChzdHJfY291bnQoWDY1NSwiXFwkYSIpPT0xJmdyZXBsKCJLc2nEhcW8a2EgemFiYXdrYXxLc2nEhcW8a2kgZGxhIG1hxYJ5Y2ggZHppZWNpfEtzacSFxbxrYSBkbyBrb2xvcm93YW5pYXxLc2nEhcW8a2EgeiBuYWtsZWprYW1pfEtzacSFxbxraSBkbGEgcHJ6ZWRzemtvbGFrw7N3fFd5ZGF3bmljdHdhIGRsYSBkemllY2kiLFg2NTUpKXxzdHJfY291bnQoWDY1NSwiXFwkYSIpPT0yJmdyZXBsKCJLc2nEhcW8a2Egb2JyYXprb3dhIixYNjU1KSZncmVwbCgiS3NpxIXFvGtpIGRsYSBtYcWCeWNoIGR6aWVjaSIsWDY1NSl8c3RyX2NvdW50KFg2NTUsIlxcJGEiKT09MiZncmVwbCgiS3NpxIXFvGthIGRvIGtvbG9yb3dhbmlhIixYNjU1KSZncmVwbCgiUHVibGlrYWNqZSBkbGEgZHppZWNpIixYNjU1KXxzdHJfY291bnQoWDY1NSwiXFwkYSIpPT0yJmdyZXBsKCJLc2nEhcW8a2kgemFiYXdraSIsWDY1NSkmZ3JlcGwoIld5Y2luYW5raSIsWDY1NSl8c3RyX2NvdW50KFg2NTUsIlxcJGEiKT09MiZncmVwbCgiS3NpxIXFvGtpIGRsYSBtYcWCeWNoIGR6aWVjaSIsWDY1NSkmZ3JlcGwoIlB1Ymxpa2FjamUgZGxhIGR6aWVjaSIsWDY1NSkpDQoNCmJuX29rIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgZnJvbSBibl9vayBhDQogICAgICAgICAgICAgICB3aGVyZSBhLmlkIG5vdCBpbiAoc2VsZWN0IGIuaWQgZnJvbSBrc196YWJhd2tpIGIpIikNCmNodW5rMyA8LSBibl9vaw0KYGBgDQoNCmBgYHtyIGF1dG9tYXR5Y3puZSB1c3VuacSZY2llIElOTyBuYSBwb2RzdGF3aWUgd2N6ZcWbbmllanN6eWNoIGltcG9ydMOzd30NCmJuX29rIDwtIGNodW5rMw0KI3BvYnJhbmllIHN0YXJ5Y2ggbGlzdCBrc2nEhcW8ZWsgeiBpbXBvcnR1DQojYWt0dWFsaXphY2phIC0gdXp1cGXFgm5paiBvc3RhdG5pIGJyYWt1asSFY3kgemFpbXBvcnRvd2FueSByb2N6bmlrDQpsaXN0eV8yMDEwIDwtIHNoZWV0c19yZWFkKHNzID0gIjFWamVnMEpzWUktOHY5Qi14X3l5dWpJaG13N1VSN0xrN3BvZXhySE5kVnpNIiwgc2hlZXQgPSAibGlzdGFfa3NpYXplayIpDQpsaXN0eV8yMDA5IDwtIHNoZWV0c19yZWFkKHNzID0gIjFHYzRnUVNtOWI0TkRUUXlzaWF1elc5SmFjNnlQMG9OdUZiQjh1dE80a1M0Iiwgc2hlZXQgPSAibGlzdGFfa3NpYXplayIpDQpsaXN0eV8yMDA1IDwtIHNoZWV0c19yZWFkKHNzID0gIjFIa1drWDYxc1FXa3RTWGYwdjB1UFY4ajJEd3VUb2Nlc3lDSnVLVGRpc0lVIiwgc2hlZXQgPSAibGlzdGFfa3NpYXplayIpDQpsaXN0eV8yMDA2IDwtIHNoZWV0c19yZWFkKHNzID0gIjF6ZU14X0lkc3VtOEptbE02RzdFdWZ4OUx4bG9Ib0FIdjhWLU15NzFWWmY0Iiwgc2hlZXQgPSAibGlzdGFfa3NpYXplayIpDQpsaXN0eV8yMDA3IDwtIHNoZWV0c19yZWFkKHNzID0gIjE5aUw3WW9EOHVnLXJMbnB6UzZGRDQ2YVMySjFCUmY0cUw1VnhsbHl3Q0dFIiwgc2hlZXQgPSAibGlzdGFfa3NpYXplayIpDQpsaXN0eV8yMDA4IDwtIHNoZWV0c19yZWFkKHNzID0gIjFSc2hUZVdkWEJFN096T0Vmb0dwTDlMamJfR1hEbEdEZVBOalYxSEttdU9vIiwgc2hlZXQgPSAibGlzdGFfa3NpYXplayIpDQpsaXN0eV8yMDA0IDwtIHNoZWV0c19yZWFkKHNzID0gIjFSbURpYTk3czRCOEY3NHNTN1dicG52X0E5ek1mcjR4VHZjRDlsZXVrQWZNIiwgc2hlZXQgPSAibGlzdGFfa3NpxIXFvGVrIikgJT4lDQogIG11dGF0ZSh0eXBfa3NpYXpraSA9IE5BLCBsaW5rID0gTkEsIGxpbmtfMSA9IE5BLCBzdGF0dXMgPSBOQSwgYmxhZF93X2ltcG9yY2llX3R5dHVsdSA9IE5BKSAlPiUNCiAgc2VsZWN0KHByYWNvd25payxaQV9aQVBJU19JRCx0eXBfa3NpYXpraSwgbGluaywgbGlua18xLCByb2ssIHN0YXR1cywgYmxhZF93X2ltcG9yY2llX3R5dHVsdSwgWDEwMCwgWDI0NSwgWDY1MCwgWDY1NSwgWDI0NiwgWDI1MCwgWDI2MCwgWDMwMCwgWDM4MCwgWDQ5MCwgWDUwMCwgWDUwMSwgWDU0NiwgWDYwMCwgWDcwMCwgWDA0MSwgWDA4MCkNCiN1amVkbm9saWNlbmllIDIwMDQgZG8gd3pvcnUgcMOzxbpuaWVqc3p5Y2ggcm9jem5pa8OzVw0KZG8yMDA0IDwtIFJKREJDOjpkYkdldFF1ZXJ5KFBCTCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IHouemFfemFwaXNfaWQsIHouemFfc3RhdHVzX2ltcA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gcGJsX3phcGlzeSB6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgei56YV91d2FnaSBsaWtlICclaW1wb3J0JTAyJSciKQ0KbGlzdHlfMjAwNCA8LSBtZXJnZShsaXN0eV8yMDA0LGRvMjAwNCxieSA9ICJaQV9aQVBJU19JRCIsYWxsLnggPSBUUlVFKSAlPiUNCiAgbXV0YXRlKHN0YXR1cyA9IFpBX1NUQVRVU19JTVApICU+JQ0KICBzZWxlY3QoLVpBX1NUQVRVU19JTVApICU+JQ0KICBzZWxlY3QocHJhY293bmlrLFpBX1pBUElTX0lELHR5cF9rc2lhemtpLCBsaW5rLCBsaW5rXzEsIHJvaywgc3RhdHVzLCBibGFkX3dfaW1wb3JjaWVfdHl0dWx1LCBYMTAwLCBYMjQ1LCBYNjUwLCBYNjU1LCBYMjQ2LCBYMjUwLCBYMjYwLCBYMzAwLCBYMzgwLCBYNDkwLCBYNTAwLCBYNTAxLCBYNTQ2LCBYNjAwLCBYNzAwLCBYMDQxLCBYMDgwKQ0KI3phcGV3bmllbmllIHR5Y2ggc2FteWNoIG5hencga29sdW1uDQojYWt0dWFsaXphY2phIC0gd3Byb3dhZMW6IHdpZXJzeiBkbGEgb3N0YXRuaWVnbyB6YWltcG9ydG93YW5lZ28gcm9jem5pa2ENCmNvbG5hbWVzKGxpc3R5XzIwMTApIDwtIG5hbWVzKGxpc3R5XzIwMDQpDQpjb2xuYW1lcyhsaXN0eV8yMDA5KSA8LSBuYW1lcyhsaXN0eV8yMDA0KQ0KY29sbmFtZXMobGlzdHlfMjAwNSkgPC0gbmFtZXMobGlzdHlfMjAwNCkNCmNvbG5hbWVzKGxpc3R5XzIwMDYpIDwtIG5hbWVzKGxpc3R5XzIwMDQpDQpjb2xuYW1lcyhsaXN0eV8yMDA3KSA8LSBuYW1lcyhsaXN0eV8yMDA0KQ0KY29sbmFtZXMobGlzdHlfMjAwOCkgPC0gbmFtZXMobGlzdHlfMjAwNCkNCmxpc3R5XzIwMDQgPC0gbGlzdHlfMjAwNCAlPiUNCiAgbXV0YXRlKFg2NTUgPSBzdHJfcmVtb3ZlKHN0cl9yZXBsYWNlX2FsbChYNjU1LCIoXFwkYSkiLCJ8XFwxIiksIl5cXHwiKSwNCiAgICAgICAgIFg2NTAgPSBzdHJfcmVtb3ZlKHN0cl9yZXBsYWNlX2FsbChYNjUwLCIoXFwkYSkiLCJ8XFwxIiksIl5cXHwiKSkNCg0KI3d5em5hY3plbmllIGxpc3R5IDY1MCBpIDY1NSBkbyBhdXRvbWF0eWN6bmVnbyBJTk8gbmEgcG9kc3Rhd2llIHdjemXFm25pZWpzenljaCBpbXBvcnTDs3cgLSB1c3VuacSZdGUgc8SFIHR5bGtvIHRlIGRlc2tyeXB0b3J5LCBrdMOzcmUgbmllIG1hasSFIHp3acSFemt1IHogbGl0ZXJhdHVyxIUgcG9kbWlvdG93xIUNCnphcGlzeSA8LSBSSkRCQzo6ZGJHZXRRdWVyeShQQkwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCB6LnphX3phcGlzX2lkLCB6LnphX3N0YXR1c19pbXAsIHouemFfdXdhZ2ksIHouemFfYWRub3RhY2plDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwYmxfemFwaXN5IHoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB6LnphX3V3YWdpIGxpa2UgJyVpbXBvcnQlJyIpICU+JQ0KICBtdXRhdGUocHJhY293bmlrX3BibCA9IHN0cl9leHRyYWN0KFpBX1VXQUdJLCAiKD88PWFrY2VwdHVqZTopKFtBLVpdKikiKSkgJT4lDQogIHNlbGVjdChaQV9aQVBJU19JRCxwcmFjb3duaWtfcGJsLFpBX1NUQVRVU19JTVAsWkFfQUROT1RBQ0pFKQ0KI2FrdHVhbGl6YWNqYSAtIGRvZGFqIGRvIHNrcnlwdHUgbGlzdMSZIHogb3N0YXRuaW0gYnJha3VqxIVjeW0gemFpbXBvcnRvd2FueW0gcm9jem5pa2llbQ0KZG9faW1wb3J0dV9OSUUgPC0gcmJpbmQobGlzdHlfMjAwNCxsaXN0eV8yMDA1LGxpc3R5XzIwMDYsbGlzdHlfMjAwNyxsaXN0eV8yMDA4LCBsaXN0eV8yMDA5LCBsaXN0eV8yMDEwKSAlPiUNCiAgZnVsbF9qb2luKC4semFwaXN5LGJ5ID0gIlpBX1pBUElTX0lEIikgJT4lDQogIHNlbGVjdChYNjUwLFg2NTUsWkFfU1RBVFVTX0lNUCxaQV9BRE5PVEFDSkUpICU+JQ0KICBtdXRhdGUoWDY1MCA9IHN0cl9yZW1vdmVfYWxsKFg2NTAsIlxcXFw3IiksDQogICAgICAgICBYNjU1ID0gc3RyX3JlbW92ZV9hbGwoWDY1NSwiXFxcXDciKSwNCiAgICAgICAgIGpvaW50ID0gcGFzdGUoWDY1MCxYNjU1LHNlcCA9ICJ+IikpICU+JQ0KICBzZWxlY3QoWkFfU1RBVFVTX0lNUCxqb2ludCxaQV9BRE5PVEFDSkUpICU+JQ0KICBncm91cF9ieShqb2ludCkgJT4lDQogIG11dGF0ZShncnVwYSA9IHBhc3RlKFpBX1NUQVRVU19JTVAsY29sbGFwc2UgPSAiLCIpLA0KICAgICAgICAgWkFfQUROT1RBQ0pFID0gcGFzdGUoWkFfQUROT1RBQ0pFLGNvbGxhcHNlID0gIiwiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KGpvaW50LCBncnVwYSxaQV9BRE5PVEFDSkUpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgicm96cGlzYW5hfHJvenBpc2HEh3xyb3pwaXNhbmlhIixaQV9BRE5PVEFDSkUpKSAlPiUgDQogIG11dGF0ZShpbGUgPSBzdHJfY291bnQoZ3J1cGEsIiwiKSsxKSAlPiUNCiAgZmlsdGVyKGdyZXBsKCJJTk8iLGdydXBhKSkgJT4lDQogIGZpbHRlcighZ3JlcGwoIklPS3xJTVB8SVBOfElQQyIsZ3J1cGEpKSAlPiUNCiAgbXV0YXRlKGN6eSA9IHN0cl9kZXRlY3Qoam9pbnQsIlxcJHlbXFxkLV0rIHdcXC4iKSkgJT4lDQogIGZpbHRlcihjenk9PUZBTFNFKSAlPiUNCiAgc2VsZWN0KGpvaW50KSAlPiUNCiAgbXV0YXRlKGpvaW50ID0gc3RyX3JlbW92ZV9hbGwoc3RyX3JlcGxhY2VfYWxsKGpvaW50LCIoXFwkYSkiLCJcXFxcIzdcXDEiKSwiIyIpKSAlPiUNCiAgbXV0YXRlKGRvX3d5cnp1Y2VuaWFfbmFfcG9kc3Rhd2llX0lOTyA9ICJ0YWsiKQ0KDQpibl9vayA8LSBibl9vayAlPiUNCiAgbXV0YXRlKFg2NTAgPSBpZmVsc2UoWDY1MD09IiIsTkEsYXMuY2hhcmFjdGVyKFg2NTApKSwNCiAgICAgICAgIFg2NTUgPSBpZmVsc2UoWDY1NT09IiIsTkEsYXMuY2hhcmFjdGVyKFg2NTUpKSwNCiAgICAgICAgIGpvaW50ID0gcGFzdGUoWDY1MCxYNjU1LHNlcCA9ICJ+IikpICU+JQ0KICBsZWZ0X2pvaW4oLixkb19pbXBvcnR1X05JRSxieSA9ICJqb2ludCIpICU+JQ0KICBtdXRhdGUoWDY1MCA9IGlmZWxzZShpcy5uYShYNjUwKSwiIixhcy5jaGFyYWN0ZXIoWDY1MCkpLA0KICAgICAgICAgWDY1NSA9IGlmZWxzZShpcy5uYShYNjU1KSwiIixhcy5jaGFyYWN0ZXIoWDY1NSkpKQ0KDQpkb19pbXBvcnR1X05JRSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKGlzLm5hKG9zb2JhX2JuX2F1dG9yKSZpcy5uYShvc29iYV9ibl90ZW1hdCkmaXMubmEoc2xvd2FfbGl0ZXJhY2tpZSkmZG9fd3lyenVjZW5pYV9uYV9wb2RzdGF3aWVfSU5PPT0idGFrIikgJT4lDQogIGZpbHRlcighZ3JlcGwoImxpdGVyYXR8bGl0ZXJhY3xwYW1pxJl0bmlrfHBpc2FyIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSkpDQoNCmJuX29rIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgZnJvbSBibl9vayBhDQogICAgICAgICAgICAgICB3aGVyZSBhLmlkIG5vdCBpbiAoc2VsZWN0IGIuaWQgZnJvbSBkb19pbXBvcnR1X05JRSBiKSIpICU+JQ0KICBzZWxlY3QoLWpvaW50LC1kb193eXJ6dWNlbmlhX25hX3BvZHN0YXdpZV9JTk8pDQoNCiN1c3VuacSZY2llIG5hIHBvZHN0YXdpZSB0YWJlbCBLUA0Kb3V0IDwtIHNoZWV0c19yZWFkKHNzID0gIjFsT19adHd5QkRlUEdxWGtnV3lrX1dtR2VRQmFBUUJ2RVVqTm5jdHJ3LXZnIikgJT4lDQogIGZpbHRlcih3Y2hvZHppX2RvX3BibCA9PSAibmllIikNCg0KS1Bfb3V0IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIld5ZGF3bmljdHdhIHBvcHVsYXJuZSIsWDY1NSkpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZnVsbF9qb2luKC4sb3V0LGJ5ID0gIlg2NTAiKSAlPiUNCiAgZmlsdGVyKHdjaG9kemlfZG9fcGJsPT0ibmllIikgJT4lDQogIGZpbHRlcighaXMubmEoWDY1NSkpICU+JQ0KICBzZWxlY3QoaWQpDQoNCmJuX29rIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgZnJvbSBibl9vayBhDQogICAgICAgICAgICAgICB3aGVyZSBhLmlkIG5vdCBpbiAoc2VsZWN0IGIuaWQgZnJvbSBLUF9vdXQgYikiKQ0KDQojY3p5IHByw7Nib3dhxIcgd3lyenVjYcSHIHBvIFVLRCwga3TDs3JlIGRvc3Rhd2HFgm8gdHlsa28gSU5PPw0KI2FrdHVhbGl6YWNqYSAtIGRvZGFqIGRvIHNrcnlwdHUgbGlzdMSZIHogb3N0YXRuaW0gYnJha3VqxIVjeW0gemFpbXBvcnRvd2FueW0gcm9jem5pa2llbQ0KZG9faW1wb3J0dV9OSUUyIDwtIHJiaW5kKGxpc3R5XzIwMDQsbGlzdHlfMjAwNSxsaXN0eV8yMDA2LGxpc3R5XzIwMDcsbGlzdHlfMjAwOCwgbGlzdHlfMjAwOSwgbGlzdHlfMjAxMCkgJT4lDQogIGZ1bGxfam9pbiguLHphcGlzeSxieSA9ICJaQV9aQVBJU19JRCIpICU+JQ0KICBzZWxlY3QoWDA4MCxaQV9TVEFUVVNfSU1QKSAlPiUNCiAgbXV0YXRlKFgwODAgPSBzdHJfcmVtb3ZlX2FsbChYMDgwLCJcXFxcIikpICU+JQ0KICBzZWxlY3QoWkFfU1RBVFVTX0lNUCxYMDgwKSAlPiUNCiAgZ3JvdXBfYnkoWDA4MCkgJT4lDQogIG11dGF0ZShncnVwYSA9IHBhc3RlKFpBX1NUQVRVU19JTVAsY29sbGFwc2UgPSAiLCIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoWDA4MCwgZ3J1cGEpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKGlsZSA9IHN0cl9jb3VudChncnVwYSwiLCIpKzEpICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIklOTyIsZ3J1cGEpKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgiSU9LfElNUHxJUE58SVBDIixncnVwYSkpICU+JQ0KI3R1IHNpxJkgbXVzaSBLUCB3eXBvd2llZHppZcSHLCBjenkgamFrIGJ5xYJvIDJ4TklFIHRvIHd5c3RhcmN6eSwgxbxlYnkgd3l3YWxhxIcNCiMgIGZpbHRlcihpbGUgPiAxKSAlPiUNCiAgc2VsZWN0KFgwODApICU+JQ0KICBtdXRhdGUoWDA4MCA9IHBhc3RlKCJcXCIsc3RyX3JlbW92ZV9hbGwoc3RyX3JlcGxhY2VfYWxsKFgwODAsIihcXCRhKSIsIlxcXFwjXFwxIiksIiMiKSxzZXAgPSAiIikpICU+JQ0KICBtdXRhdGUoZG9fd3lyenVjZW5pYV9uYV9wb2RzdGF3aWVfSU5PID0gInRhayIpDQoNCiNuYSBwb2RzdGF3aWUgVUtEIHRlxbwgd3lyenVjacSHIC0gZGVjeXpqYSBLUA0KYm5fb2sgPC0gYm5fb2sgJT4lDQogIGZ1bGxfam9pbiguLGRvX2ltcG9ydHVfTklFMixieSA9ICJYMDgwIikgJT4lDQogIGZpbHRlcighaXMubmEoaWQpKQ0KDQpkb19pbXBvcnR1X05JRTIgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihpcy5uYShvc29iYV9ibl9hdXRvcikmaXMubmEob3NvYmFfYm5fdGVtYXQpJmlzLm5hKHNsb3dhX2xpdGVyYWNraWUpJmRvX3d5cnp1Y2VuaWFfbmFfcG9kc3Rhd2llX0lOTz09InRhayIpDQoNCmJuX29rIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgZnJvbSBibl9vayBhDQogICAgICAgICAgICAgICB3aGVyZSBhLmlkIG5vdCBpbiAoc2VsZWN0IGIuaWQgZnJvbSBkb19pbXBvcnR1X05JRTIgYikiKSAlPiUNCiAgc2VsZWN0KC1kb193eXJ6dWNlbmlhX25hX3BvZHN0YXdpZV9JTk8pDQoNCiNyZXN6dGEgcmVrb3Jkw7N3LCBrdMOzcmUgbmllIGLEmWTEhSB6YWltcG9ydG93YW5lDQpyZXN6dGEgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICBmcm9tIGJuX2tzIGENCiAgICAgICAgICAgICAgIHdoZXJlIGEuaWQgbm90IGluIA0KICAgICAgICAgICAgICAgKHNlbGVjdCBiLmlkDQogICAgICAgICAgICAgICBmcm9tIGJuX29rIGIpIikNCmNodW5rNCA8LSBibl9vaw0KYGBgDQoNCmBgYHtyIHByenlwaXNhbmllIGtzacSFxbxjZSByb2R6YWp1IChwb2RtaW90b3dhLCBwcnplZG1pb3Rvd2EsIGFudG9sb2dpZSwgd3Nww7PFgnd5ZGFuaWUpfQ0KYm5fb2sgPC0gY2h1bms0DQpzdGFyZV9yb2R6YWpvd2FuaWUgPC0gYm5fb2sgJT4lDQogIG11dGF0ZShjenlfbWFfdWtkID0gaWZlbHNlKFgwODA9PSIiLCJuaWUiLCJ0YWsiKSwNCiAgICAgICAgIHBvc2l0aW9uX2Rhc2ggPSBpZmVsc2UoZ3JlcGwoIihcXFxcXFxcXFxcJGF8OikoODIxXFwuKSIsWDA4MCksc3RyX2xvY2F0ZShYMDgwLCJcXC0iKVssMV0sIE5BKSwNCiAgICAgICAgIHBvc2l0aW9uX2Rhc2ggPSBpZmVsc2UoaXMubmEocG9zaXRpb25fZGFzaCksIiIsYXMuaW50ZWdlcihwb3NpdGlvbl9kYXNoKSksDQogICAgICAgICBwb3NpdGlvbl8wOTEgPSBzdHJfbG9jYXRlKFgwODAsIlxcKDA5MVxcKSIpWywxXSwNCiAgICAgICAgIHBvc2l0aW9uXzA5MSA9IGlmZWxzZShpcy5uYShwb3NpdGlvbl8wOTEpLCIiLGFzLmludGVnZXIocG9zaXRpb25fMDkxKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShncmVwbCgiQW50b2xvZ2kiLFg2NTUpLCJhbnRvbG9naWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHBvc2l0aW9uXzA5MSE9IiImcG9zaXRpb25fZGFzaCE9IiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhcy5pbnRlZ2VyKHBvc2l0aW9uXzA5MSk8YXMuaW50ZWdlcihwb3NpdGlvbl9kYXNoKSwgInByemVkbWlvdG93YSIsICJwb2RtaW90b3dhIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwb3NpdGlvbl9kYXNoIT0iIiwicG9kbWlvdG93YSIsInByemVkbWlvdG93YSIpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShjenlfbWFfdWtkPT0ibmllIiwiIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSkNCmdhdHVua2lfcG9kbWlvdG93ZSA8LSBzdGFyZV9yb2R6YWpvd2FuaWUgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiKSAlPiUNCiAgc2VsZWN0KFg2NTUpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgY1NwbGl0KC4sIlg2NTUiLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoWDY1NSwiXFwkeVtcXGQtXSsgd1xcLiIpKQ0KZ2F0dW5raV9wb2RtaW90b3dlIDwtIHN0cl9yZXBsYWNlX2FsbChzdHJfcmVwbGFjZV9hbGwocGFzdGUoZ2F0dW5raV9wb2RtaW90b3dlJFg2NTUsY29sbGFwc2UgPSAifCIpLCIoLnsyfSkoXFwkYSkiLCJcXDIiKSwiXFwkIiwiXFxcXCQiKQ0Kc3RhcmVfcm9kemFqb3dhbmllJGN6eV9wb2RtaW90b3d5IDwtIGdyZXBsKGdhdHVua2lfcG9kbWlvdG93ZSxzdGFyZV9yb2R6YWpvd2FuaWUkWDY1NSl8Z3JlcGwoZ2F0dW5raV9wb2RtaW90b3dlLHN0YXJlX3JvZHpham93YW5pZSRYNjUwKQ0Kc3RhcmVfcm9kemFqb3dhbmllIDwtIHN0YXJlX3JvZHpham93YW5pZSAlPiUNCiAgbXV0YXRlKHJvZHphal9rc2lhemtpID0gaWZlbHNlKHN0cl9jb3VudChYMjQ1LCAiIC8gIikrMT4yLCJhbnRvbG9naWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9jb3VudChYMjQ1LCAiIC8gIikrMT09Miwid3Nww7PFgnd5ZGFuaWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShyb2R6YWpfa3NpYXpraT09IiImY3p5X3BvZG1pb3Rvd3k9PVRSVUUmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTApJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjU1KSwicG9kbWlvdG93YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShYMTAwIT0iIiZncmVwbCgiYVBhbWnEmXRuaWt8YUxpdGVyYXR1cmEgcG9kcsOzxbxuaWN6YSIsWDY1NSkmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTApJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjU1KSwicG9kbWlvdG93YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWDEwMCE9IiImZ3JlcGwoImFSZXBvcnRhxbwiLFg2NTUpJmdyZXBsKCJcXCR5IixYNjU1KSYhZ3JlcGwoInhoaXN0b3JpYXx4dGVtYXR5a2F8eGJpb2dyYWZpYSIsWDY1MCkmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTUpLCJwb2RtaW90b3dhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWDEwMCE9IiImKFg2NTU9PSJcXDckYVJlcG9ydGHFvCBwb2xza2kkMkRCTiJ8WDY1NT09IlxcNyRhUmVwb3J0YcW8JDJEQk4iKSYhZ3JlcGwoInhoaXN0b3JpYXx4dGVtYXR5a2F8eGJpb2dyYWZpYSIsWDY1MCkmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTUpLCJwb2RtaW90b3dhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHJvZHphal9rc2lhemtpPT0iIiZjenlfcG9kbWlvdG93eT09RkFMU0UsInByemVkbWlvdG93YSIsYXMuY2hhcmFjdGVyKHJvZHphal9rc2lhemtpKSkpKSkpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShyb2R6YWpfa3NpYXpraT09IiIsInByemVkbWlvdG93YSIsYXMuY2hhcmFjdGVyKHJvZHphal9rc2lhemtpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShncmVwbCgiTGVrdHVyeSBXc3plY2ggQ3phc8OzdyA6IHN0cmVzemN6ZW5pZSwgYW5hbGl6YSwgaW50ZXJwcmV0YWNqYXxMZWt0dXJ5IFdzemVjaCBDemFzw7N3IC0gTGl0ZXJhdHxCaWJsaW90ZWN6a2EgT3ByYWNvd2HFhCIsWDQ5MCl8Z3JlcGwoIkxla3R1cnkgV3N6ZWNoIEN6YXPDs3cgOiBzdHJlc3pjemVuaWUsIGFuYWxpemEsIGludGVycHJldGFjamF8TGVrdHVyeSBXc3plY2ggQ3phc8OzdyAtIExpdGVyYXR8QmlibGlvdGVjemthIE9wcmFjb3dhxYQiLFg4MzApLCJwcnplZG1pb3Rvd2EiLGFzLmNoYXJhY3Rlcihyb2R6YWpfa3NpYXpraSkpLA0KICAgICAgICAgaWx1X3R3b3Jjb3cgPSBzdHJfY291bnQoWDEwMCwiXFwkYSIpLA0KICAgICAgICAgcm9kemFqX2tzaWF6a2kgPSBpZmVsc2UoaWx1X3R3b3Jjb3c+NCZyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiLCJhbnRvbG9naWEiLGFzLmNoYXJhY3Rlcihyb2R6YWpfa3NpYXpraSkpLA0KICAgICAgICAgcm9kemFqX2tzaWF6a2kgPSBpZmVsc2UoZ3JlcGwoIkxlZ2VuZHkiLFg2NTUpLCJhbnRvbG9naWEiLGFzLmNoYXJhY3Rlcihyb2R6YWpfa3NpYXpraSkpKSAlPiUNCiAgZmlsdGVyKGdyZXBsKCJrYXRhbG9nIHd5c3Rhd3kiLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKSZyb2R6YWpfa3NpYXpraT09InByemVkbWlvdG93YSIpICU+JSANCiAgc2VsZWN0KGlkKQ0KDQojI3fFgmHFm2Npd2Ugcm9kemFqb3dhbmllIHogdXdhZ2zEmWRuaWVuaWVtIGplZG5lZ28gZWxlbWVudHUgemUgc3RhcmVnbyByb2R6YWpvd2FuaWENCmJuX29rIDwtIGJuX29rICU+JQ0KICBtdXRhdGUoY3p5X21hX3VrZCA9IGlmZWxzZShYMDgwPT0iIiwibmllIiwidGFrIiksDQogICAgICAgICBwb3NpdGlvbl9kYXNoID0gaWZlbHNlKGdyZXBsKCIoXFxcXFxcXFxcXCRhfDopKDgyMVxcLikiLFgwODApLHN0cl9sb2NhdGUoc3RyX3JlcGxhY2UoWDA4MCwiKC4qPykoXFwkYTgyMVxcLikoLio/JCkiLCJcXDJcXDMiKSwiXFwtIilbLDFdK25jaGFyKHN0cl9yZXBsYWNlKFgwODAsIiguKj8pKFxcJGE4MjFcXC4pKC4qPyQpIiwiXFwxIikpLCBOQSksDQogICAgICAgICBwb3NpdGlvbl9kYXNoID0gaWZlbHNlKGlzLm5hKHBvc2l0aW9uX2Rhc2gpLCIiLGFzLmludGVnZXIocG9zaXRpb25fZGFzaCkpLA0KICAgICAgICAgcG9zaXRpb25fMDkxID0gc3RyX2xvY2F0ZShYMDgwLCJcXCgwOTFcXCkiKVssMV0sDQogICAgICAgICBwb3NpdGlvbl8wOTEgPSBpZmVsc2UoaXMubmEocG9zaXRpb25fMDkxKSwiIixhcy5pbnRlZ2VyKHBvc2l0aW9uXzA5MSkpLA0KICAgICAgICAgcm9kemFqX2tzaWF6a2kgPSBpZmVsc2UoZ3JlcGwoImFudG9sb2dpfFByenlzxYJvd2lhIFtcXFNdK1xcJDJ8Q3l0YXR5XFwkMiIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpLCJhbnRvbG9naWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHBvc2l0aW9uXzA5MSE9IiImcG9zaXRpb25fZGFzaCE9IiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhcy5pbnRlZ2VyKHBvc2l0aW9uXzA5MSk8YXMuaW50ZWdlcihwb3NpdGlvbl9kYXNoKSwgInByemVkbWlvdG93YSIsICJwb2RtaW90b3dhIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwb3NpdGlvbl9kYXNoIT0iIiwicG9kbWlvdG93YSIsInByemVkbWlvdG93YSIpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShjenlfbWFfdWtkPT0ibmllIiwiIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSwNCiAgICAgICAgIHJvZHphal9rc2lhemtpID0gaWZlbHNlKGdyZXBsKCI4Mi05MyIsWDA4MCkmcm9kemFqX2tzaWF6a2khPSJhbnRvbG9naWEiLCJwb2RtaW90b3dhIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSkNCg0KcmVrb3JkeV9wb2RtaW90b3dlX3N0YXJlIDwtIGRiR2V0UXVlcnkoUEJMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCB6LnphX3phcGlzX2lkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwYmxfemFwaXN5IHoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luIElCTF9PV05FUi5wYmxfcm9kemFqZV96YXBpc293IHJ6IG9uIHJ6LnJ6X3JvZHphal9pZD16LnphX3J6X3JvZHphajFfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSByei5yel9yb2R6YWpfaWQ9MQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB6LnphX3V3YWdpIGxpa2UgJyVpbXBvcnQlJyIpDQojYWt0dWFsaXphY2phIC0gZG9kYWogZG8gc2tyeXB0dSBsaXN0xJkgeiBvc3RhdG5pbSBicmFrdWrEhWN5bSB6YWltcG9ydG93YW55bSByb2N6bmlraWVtDQpnYXR1bmtpX3BvcHJ6ZWRuaWVfaW1wIDwtIHJiaW5kKGxpc3R5XzIwMDQsbGlzdHlfMjAwNSxsaXN0eV8yMDA2LGxpc3R5XzIwMDcsbGlzdHlfMjAwOCwgbGlzdHlfMjAwOSwgbGlzdHlfMjAxMCkgJT4lIA0KICBmaWx0ZXIoWkFfWkFQSVNfSUQgJWluJSByZWtvcmR5X3BvZG1pb3Rvd2Vfc3RhcmUkWkFfWkFQSVNfSUQpICU+JSANCiAgbXV0YXRlKFg2NTUgPSBpZmVsc2Uocm9rPT0yMDA0LHN0cl9yZW1vdmVfYWxsKHN0cl9yZXBsYWNlX2FsbChYNjU1LCIoXFwkYSkiLCJcXFxcIzdcXDEiKSwiIyIpLGFzLmNoYXJhY3RlcihYNjU1KSkpICU+JSANCiAgc2VsZWN0KFg2NTUpICU+JSANCiAgdW5pcXVlKCkNCg0KZ2F0dW5raV9wb2RtaW90b3dlIDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIikgJT4lDQogIHNlbGVjdChYNjU1KSAlPiUNCiAgYmluZF9yb3dzKC4sZ2F0dW5raV9wb3ByemVkbmllX2ltcCkgJT4lIA0KICB1bmlxdWUoKSAlPiUNCiAgY1NwbGl0KC4sIlg2NTUiLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjU1KSkgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChYNjU1LCJcXCR5W1xcZC1dKyB3XFwuIiksIA0KICAgICAgICAgZ3JlcGwoIiggXFxTKykoXFwkeSkoLio/JCkiLCBYNjU1KSkgJT4lIA0KICAjbXV0YXRlKFg2NTUgPSBzdHJfcmVwbGFjZShYNjU1LCAiKD88PSApKFxcUyspKFxcJHkpKC4qPyQpIiwgIltcXFxcU10rXFwyIikpICU+JSANCiAgbXV0YXRlKFg2NTUgPSBzdHJfcmVwbGFjZShYNjU1LCAiKD88PSApKFxcUyspKFxcJHkpKC4qPyQpIiwgIi4rXFwyIikpICU+JSANCiAgdW5pcXVlKCkNCg0KZ2F0dW5raV9wb2RtaW90b3dlIDwtIHN0cl9yZXBsYWNlX2FsbChzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKHBhc3RlKGdhdHVua2lfcG9kbWlvdG93ZSRYNjU1LGNvbGxhcHNlID0gInwiKSwiKC57Mn0pKFxcJGEpIiwiXFwyIiksIlxcJCIsIlxcXFwkIiksICJcXCgiLCAiXFxcXFxcKCIpDQpibl9vayRjenlfcG9kbWlvdG93eSA8LSBncmVwbChnYXR1bmtpX3BvZG1pb3Rvd2UsYm5fb2skWDY1NSl8Z3JlcGwoZ2F0dW5raV9wb2RtaW90b3dlLGJuX29rJFg2NTApDQpibl9vayA8LSBibl9vayAlPiUNCiAgbXV0YXRlKHJvZHphal9rc2lhemtpID0gaWZlbHNlKHN0cl9jb3VudChYMjQ1LCAiIFxcLyAiKSsxPjIsImFudG9sb2dpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2NvdW50KFgyNDUsICIgXFwvIFxcW3swLDF9W0EtWkHDgcOAw4LDg8OExILEgMOFxITDhkXDicOIw4rDi8SaxJLElsSYScONw4zDjsOPxKrErklPw5PDksOUw5XDlsWQw5jFklXDmsOZw5vDnMWwxarFr1nDnUPEhsSMw6dExI7EkMSQR8SixJ5LxLZMxYHEu07Fg8ORxYfFhcWKUsWYU8WaxaDFnlPDn1TFpMWmw57FojhaxbvFucW9XSIpKzE9PTIsIndzcMOzxYJ3eWRhbmllIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uocm9kemFqX2tzaWF6a2k9PSIiJmN6eV9wb2RtaW90b3d5PT1UUlVFJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjUwKSYhZ3JlcGwoInhoaXN0b3JpYXx4dGVtYXR5a2F8eGJpb2dyYWZpYSIsWDY1NSksInBvZG1pb3Rvd2EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWDEwMCE9IiImZ3JlcGwoImFQYW1pxJl0bmlrfGFMaXRlcmF0dXJhIHBvZHLDs8W8bmljemEiLFg2NTUpJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjUwKSYhZ3JlcGwoInhoaXN0b3JpYXx4dGVtYXR5a2F8eGJpb2dyYWZpYSIsWDY1NSksInBvZG1pb3Rvd2EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFgxMDAhPSIiJmdyZXBsKCJhUmVwb3J0YcW8IixYNjU1KSZncmVwbCgiXFwkeSIsWDY1NSkmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTApJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjU1KSwicG9kbWlvdG93YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFgxMDAhPSIiJihYNjU1PT0iXFw3JGFSZXBvcnRhxbwgcG9sc2tpJDJEQk4ifFg2NTU9PSJcXDckYVJlcG9ydGHFvCQyREJOIikmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTApJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjU1KSwicG9kbWlvdG93YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShyb2R6YWpfa3NpYXpraT09IiImY3p5X3BvZG1pb3Rvd3k9PUZBTFNFLCJwcnplZG1pb3Rvd2EiLGFzLmNoYXJhY3Rlcihyb2R6YWpfa3NpYXpraSkpKSkpKSkpLA0KICAgICAgICAgcm9kemFqX2tzaWF6a2kgPSBpZmVsc2Uocm9kemFqX2tzaWF6a2k9PSIiLCJwcnplZG1pb3Rvd2EiLGFzLmNoYXJhY3Rlcihyb2R6YWpfa3NpYXpraSkpLA0KICAgICAgICAgcm9kemFqX2tzaWF6a2kgPSBpZmVsc2UoZ3JlcGwoIkxla3R1cnkgV3N6ZWNoIEN6YXPDs3cgXFw6IHN0cmVzemN6ZW5pZSwgYW5hbGl6YSwgaW50ZXJwcmV0YWNqYXxMZWt0dXJ5IFdzemVjaCBDemFzw7N3IC0gTGl0ZXJhdHxCaWJsaW90ZWN6a2EgT3ByYWNvd2HFhCIsWDQ5MCl8Z3JlcGwoIkxla3R1cnkgV3N6ZWNoIEN6YXPDs3cgXFw6IHN0cmVzemN6ZW5pZSwgYW5hbGl6YSwgaW50ZXJwcmV0YWNqYXxMZWt0dXJ5IFdzemVjaCBDemFzw7N3IC0gTGl0ZXJhdHxCaWJsaW90ZWN6a2EgT3ByYWNvd2HFhCIsWDgzMCksInByemVkbWlvdG93YSIsYXMuY2hhcmFjdGVyKHJvZHphal9rc2lhemtpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShncmVwbCgiYUxla3R1cmEgeiBPcHJhY293YW5pZW0gLSBaaWVsb25hIFNvd2F8YUxla3R1cmEgXFwoR3JlZ1xcKXxhTGVrdHVyYSBEb2JyemUgT3ByYWNvd2FuYXxhTGVrdHVyYSB6IE9wcmFjb3dhbmllbSAtIEliaXMiLFg4MzApLCJwb2RtaW90b3dhIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSwNCiAgICAgICAgIGlsdV90d29yY293ID0gc3RyX2NvdW50KFgxMDAsIlxcJGEiKSwNCiAgICAgICAgIHJvZHphal9rc2lhemtpID0gaWZlbHNlKGlsdV90d29yY293PjQmcm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIiwiYW50b2xvZ2lhIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSwNCiAgICAgICAgIHJvZHphal9rc2lhemtpID0gaWZlbHNlKGdyZXBsKCJMZWdlbmR5fFxcJHZhbnRvbG9naSIsWDY1NSksImFudG9sb2dpYSIsYXMuY2hhcmFjdGVyKHJvZHphal9rc2lhemtpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShzdHJfY291bnQoWDEwMCwgIlxcfCIpPT0wJlgxMDAhPSIiJnJvZHphal9rc2lhemtpPT0iYW50b2xvZ2lhIiZncmVwbCgiTGVnZW5keSBpIHBvZGFuaWF8QW50b2xvZ2lhIixYNjU1KSwicG9kbWlvdG93YSIsYXMuY2hhcmFjdGVyKHJvZHphal9rc2lhemtpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShYMTAwPT0iIiZzdHJfY291bnQoWDcwMCwiXFwkdCIpPT0zJmdyZXBsKCJIYXJsZXF1aW4iLFgyNjApLCJhbnRvbG9naWEiLGFzLmNoYXJhY3Rlcihyb2R6YWpfa3NpYXpraSkpKSAlPiUNCiAgc2VsZWN0KDE6MzQscm9kemFqX2tzaWF6a2kpDQoNCg0KIyBwcnp5cGlzYW5pYSBkbyBwb2RtaW90b3dlaiBuYSBwb2RzdGF3aWUgc21pZXJjaSBwcnplZCAxNzAwDQptYXJjX2ZpZWxkXzEwMCA8LSBibl9vayAlPiUNCiAgZmlsdGVyKCFpcy5uYShvc29iYV9ibl9hdXRvcikpICU+JQ0KICBzZWxlY3QoaWQsWDEwMCklPiUNCiAgZmlsdGVyKCFncmVwbCgiXFx8IiwgWDEwMCkpICU+JSANCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlcGxhY2VfYWxsKFgxMDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDEwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZW1vdmVfYWxsKFgxMDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChibl9vayRYMTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzEwMDwtY2JpbmQobWFyY19maWVsZF8xMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8xMDAkWDEwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzEwMCRYMTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzEwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzEwMCRYMTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8xMDAkWDEwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzEwMCA8LSBtYXJjX2ZpZWxkXzEwMCAlPiUgDQogIGZpbHRlcighaXMubmEoYCRkYCkgJiBzdHJfZXh0cmFjdChgJGRgLCAiXFxkKyg/IS4qXFxkKykiKSA8IDE3MDApDQoNCmJuX29rIDwtIGJuX29rICU+JSANCiAgbXV0YXRlKHJvZHphal9rc2lhemtpID0gaWZlbHNlKGlkICVpbiUgbWFyY19maWVsZF8xMDAkaWQsICJwb2RtaW90b3dhIiwgYXMuY2hhcmFjdGVyKHJvZHphal9rc2lhemtpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShpZCAlaW4lIHN0YXJlX3JvZHpham93YW5pZSRpZCwgInByemVkbWlvdG93YSIsYXMuY2hhcmFjdGVyKHJvZHphal9rc2lhemtpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShYMDgwPT0iXFxcXCRhODItMS8tOSgwLjA1NCkiJnJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIiYhZ3JlcGwoInhoaXN0b3JpYXx4dGVtYXR5a2F8eGJpb2dyYWZpYSIsWDY1MCkmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTUpLCJwb2RtaW90b3dhIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSwNCiAgICAgICAgIHJvZHphal9rc2lhemtpID0gaWZlbHNlKHJvZHphal9rc2lhemtpPT0icG9kbWlvdG93YSImZ3JlcGwoImF1dFxcLiIsWDI0NSkmZ3JlcGwoImV0IGFsXFwuIixYMjQ1KSwiYW50b2xvZ2lhIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSkNCmNodW5rNSA8LSBibl9vaw0KYGBgDQoNCmBgYHtyIHd5em5hY3plbmllIHpiaW9ydSBhdXRvbWF0eWN6bmllIElPS30NCmJuX29rIDwtIGNodW5rNQ0KSU9LX3BvZG0gPC0gYm5fb2sgJT4lDQogIGZpbHRlcighZ3JlcGwoIlxcJHQiLFg3MDApKSAlPiUNCiAgbXV0YXRlKGlsZV9nYXR1bmtvdyA9IGlmZWxzZShyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiLHN0cl9jb3VudChYNjU1LCJcXCRhIiksIm5pZSIpLA0KICAgICAgICAgdHlsa29fcG9kbWlvdG93ZSA9IGlmZWxzZShzdHJfY291bnQoWDY1NSwiXFwkYSIpPjAmc3RyX2NvdW50KFg2NTUsIlxcJGEiKT09c3RyX2NvdW50KFg2NTUsIlxcJHkiKSZzdHJfY291bnQoWDY1NSwiXFwkeSIpIT1zdHJfY291bnQoWDY1NSwiXFwkeCIpLCJ0YWsiLCJuaWUiKSkgJT4lDQogIGZpbHRlcihzdHJfY291bnQoWDEwMCwiXFwkYSIpPT0xKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgicHNldWR8bmF6d2EiLFg1MDAsaWdub3JlLmNhc2UgPSBUUlVFKSZYNTAxPT0iIiYodHlsa29fcG9kbWlvdG93ZT09InRhayJ8aWxlX2dhdHVua293PT0iMSIpJlgxMDAhPSIiKQ0KDQojemVzdGF3aWVuaWUgMTAwIGkgMjQ1DQojMTAwDQptYXJjX2ZpZWxkXzEwMCA8LSBJT0tfcG9kbSAlPiUNCiAgc2VsZWN0KGlkLFgxMDApJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgxMDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVtb3ZlX2FsbChYMTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgxMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoSU9LX3BvZG0kWDEwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzEwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8xMDA8LWNiaW5kKG1hcmNfZmllbGRfMTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMTAwJFgxMDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8xMDAkWDEwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8xMDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8xMDAkWDEwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMTAwJFgxMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMTAwIDwtIG1hcmNfZmllbGRfMTAwICU+JQ0KICBzZWxlY3QoaWQsYCRhYCkgJT4lDQogIG11dGF0ZShibl9uYXp3aXNrbyA9IGlmZWxzZShzdHJfZGV0ZWN0KGAkYWAsIiwiKSxzdHJfcmVwbGFjZShgJGFgLCJeKC4qPykoLCApKC4qPyQpIiwiXFwxIiksYXMuY2hhcmFjdGVyKGAkYWApKSwNCiAgICAgICAgIGJuX2ltaWUgPSBpZmVsc2Uoc3RyX2RldGVjdChgJGFgLCIsIiksc3RyX3JlcGxhY2UoYCRhYCwiXiguKj8pKCwgKSguKj8kKSIsIlxcMyIpLCIiKSkgJT4lDQogIHNlbGVjdChpZCxibl9uYXp3aXNrbyxibl9pbWllKQ0KDQpJT0tfcG9kbSA8LSBJT0tfcG9kbSAlPiUNCiAgZnVsbF9qb2luKC4sbWFyY19maWVsZF8xMDAsYnkgPSAiaWQiKQ0KDQp4IDwtIDE6bGVuZ3RoKElPS19wb2RtJGlkKQ0KZm9yIChpIGluIHgpIHsNCiAgDQogIElPS19wb2RtJGN6eV9uYXp3aXNrb1tpXSA8LSBncmVwbChJT0tfcG9kbSRibl9uYXp3aXNrb1tpXSxJT0tfcG9kbSRYMjQ1W2ldKQ0KICBJT0tfcG9kbSRjenlfaW1pZVtpXSA8LSBncmVwbChJT0tfcG9kbSRibl9pbWllW2ldLElPS19wb2RtJFgyNDVbaV0pDQogIA0KfQ0KI3VzdW5pxJljaWUgdHljaCwga3TDs3JlIG5pZSBtYWrEhSB0eXR1xYLDs3cgb3J5Z2luYWxueWNoDQpJT0tfcG9kbSA8LSBJT0tfcG9kbSAlPiUNCiAgZmlsdGVyKGN6eV9uYXp3aXNrbz09MSZjenlfaW1pZT09MSYhZ3JlcGwoImV0IGFsXFwuIixYMjQ1KSkgJT4lDQogIHNlbGVjdCgtYm5fbmF6d2lza28sLWJuX2ltaWUsLWN6eV9uYXp3aXNrbywtY3p5X2ltaWUpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKGplenlrID0gc3RyX2V4dHJhY3QoWDA0MSwoIig/PD1cXCRoKSguLi4pIikpKSAlPiUNCiAgbXV0YXRlKGN6eV90eXR1bF9vYmN5ID0gaWZlbHNlKGlzLm5hKGplenlrKSwibmllIGRvdHljenkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKCFncmVwbCgicG9sIixqZXp5ayksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFgyNDYhPSIiLCJvayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiVHl0WyxcXC5dIG9yeWciLFg1MDEpfGdyZXBsKCJUeXRbLFxcLl0gb3J5ZyIsWDUwMCksIm9rIiwicHJvYmxlbSIpKSwibmllIGRvdHljenkiKSkpICU+JQ0KICBmaWx0ZXIoY3p5X3R5dHVsX29iY3khPSJwcm9ibGVtIikgJT4lDQogIHNlbGVjdChpZCkgJT4lDQogIG11dGF0ZShhdXRvbWF0eWN6bmFfcG9kbWlvdG93YSA9ICJ0YWsiKQ0KIyMjdHV0YWoga2/FhGN6xIUgc2nEmSBhdXRvbWF0eWN6bmUgcG9kbWlvdG93ZQ0KYm5fb2sgPC0gYm5fb2sgJT4lDQogIGZ1bGxfam9pbiguLElPS19wb2RtLGJ5ID0gImlkIikgJT4lDQogIG11dGF0ZShjenlfYXV0b21hdHljem5pZSA9IGlmZWxzZSghaXMubmEoYXV0b21hdHljem5hX3BvZG1pb3Rvd2EpLCJwb2RtaW90b3dhIiwibmllIikpICU+JQ0KICBzZWxlY3QoLWF1dG9tYXR5Y3puYV9wb2RtaW90b3dhKSAlPiUNCiAgbXV0YXRlKGN6eV9hdXRvbWF0eWN6bmllID0gaWZlbHNlKGN6eV9hdXRvbWF0eWN6bmllPT0icG9kbWlvdG93YSImcm9kemFqX2tzaWF6a2khPSJwb2RtaW90b3dhIiwibmllIixhcy5jaGFyYWN0ZXIoY3p5X2F1dG9tYXR5Y3puaWUpKSkNCg0KIyMjY3p5IGkgamFrIGF1dG9tYXR5em93YcSHIHByemVkbWlvdG93xIU/DQoNCiN3cml0ZS5jc3YyKGJuX29rLCAiQzovVXNlcnMvQ2V6YXJ5L0Rlc2t0b3AvYm5fb2tfMjAwOS5jc3YiLCByb3cubmFtZXMgPSBGLCBuYSA9ICcnLCBmaWxlRW5jb2RpbmcgPSAnVVRGLTgnKQ0KY2h1bms2IDwtIGJuX29rDQpgYGANCg0KYGBge3Igd3l6bmFjemVuaWUgemJpb3J1IGRvIHV6dXBlxYJuaWVuaWEgdyBwcnp5c3rFgm/Fm2NpfQ0KYm5fb2sgPC0gY2h1bms2DQoNCiNwcm9wb3p5Y2phMQ0KI25hIHDDs8W6bmllaiBraWVyb3dhbmUgc8SFIHdzenlzdGtpZSBrc2nEhcW8a2kgcHJ6ZWRtaW90b3dlLCBrdMOzcmUgbWFqxIUgYmV6X3VrZF9QQkwgbHViIHVrZF9wb2dyYW5pY3plIGkgbmllIHPEhSBiaWJsacSFIG9yYXoga3NpxIXFvGtpIHd5ZGFuZSBwb3phIFBvbHNrxIUsIGt0w7NyZSBuaWUgcG9zesWCeSBkbyBhdXRvbWF0eWN6bmVnbyBpbXBvcnR1IG9yYXogaGFybGVxdWlueSwga3TDs3JlIG5pZSBwb3N6xYJ5IGRvIGF1dG9tYXR5Y3puZWdvIGltcG9ydHUNCm5hX3Bvem5pZWogPC0gYm5fb2sgJT4lDQogIGZpbHRlcigoaWYgKFg1MDE9PSIiKSAhZ3JlcGwoInBsIixzdWJzdHIoWDAwOCwxNiwxOCkpJiFncmVwbCgicG9sIixzdWJzdHIoWDAwOCwzNiwzOCkpJmN6eV9hdXRvbWF0eWN6bmllPT0ibmllIil8Y3p5X2F1dG9tYXR5Y3puaWU9PSJuaWUiJnJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIiZkemllZHppbmFfUEJMICVpbiUgYygiYmV6X3VrZF9QQkwiLCJ1a2RfcG9ncmFuaWN6ZSIpJihjenlfYmlibGlhIT0idGFrInxpcy5uYShjenlfYmlibGlhKSl8Z3JlcGwoImFybGVxIixYMjYwLGlnbm9yZS5jYXNlID0gVFJVRSkmY3p5X2F1dG9tYXR5Y3puaWU9PSJuaWUiKQ0KDQojYmV6cGllY3puaWsNCg0KI3Byb3BvenljamEyDQojcHJvcG96eWNqYSwgYnkga2llcm93YcSHIG5hIHDDs8W6bmllaiB3c3p5c3RraWUga3NpxIXFvGtpIHByemVkbWlvdG93ZSB6IGR6aWVkemlueSAiYmV6X3VrZF9QQkwiDQojIG5hX3Bvem5pZWogPC0gYm5fb2sgJT4lDQojICAgZmlsdGVyKGN6eV9hdXRvbWF0eWN6bmllPT0ibmllIiZyb2R6YWpfa3NpYXpraT09InByemVkbWlvdG93YSImZHppZWR6aW5hX1BCTD09ImJlel91a2RfUEJMIiYoY3p5X2JpYmxpYSE9InRhayJ8aXMubmEoY3p5X2JpYmxpYSkpKQ0KDQojICNwcm9wb3p5Y2phMw0KIyBuYV9wb3puaWVqIDwtIGJuX29rICU+JQ0KIyAgIGZpbHRlcihjenlfYXV0b21hdHljem5pZT09Im5pZSImcm9kemFqX2tzaWF6a2k9PSJwcnplZG1pb3Rvd2EiJmR6aWVkemluYV9QQkwgJWluJSBjKCJiZXpfdWtkX1BCTCIsInVrZF9wb2dyYW5pY3plIikmKGN6eV9iaWJsaWEhPSJ0YWsifGlzLm5hKGN6eV9iaWJsaWEpKSkNCg0KI3Byb3BvenljamE0DQojc3RhcmEgb3BlcmFjamENCiMgbmFfcG96bmllaiA8LSBibl9vayAlPiUNCiMgICBmaWx0ZXIoY3p5X2F1dG9tYXR5Y3puaWU9PSJuaWUiJnJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIiZkemllZHppbmFfUEJMPT0iYmV6X3VrZF9QQkwiKSAlPiUNCiMgICBtdXRhdGUoa2F0ZWdvcmllX2xpdGVyYWNraWUgPSBpZmVsc2UoZ3JlcGwoIm1pdG9sb2d8YmHFm3xiYWprfHBvZXpqfGxpcnlrfGVwaWt8ZHJhbWF0fGxpdGVyYWN8bGl0ZXJhdHxwaXNhcnx3aWVyc3p8cHJvenxwb3dpZcWbfG9wb3dpYWR8bWluaWF0dXJ8YWZvcnl6bXxlc2VqfHN6a2ljfGZlbGlldHxyZXBvcnR8ZHppZW5uaXx3c3BvbW5pZXxhdXRvYmlvZ3JhZnxrYXphfHJvem15xZtsfGxpc3R8aW50ZXJwcmV0YWNqIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoIm1pdG9sb2d8YmHFm3xiYWprfHBvZXpqfGxpcnlrfGVwaWt8ZHJhbWF0fGxpdGVyYWN8bGl0ZXJhdHxwaXNhcnx3aWVyc3p8cHJvenxwb3dpZcWbfG9wb3dpYWR8bWluaWF0dXJ8YWZvcnl6bXxlc2VqfHN6a2ljfGZlbGlldHxyZXBvcnR8ZHppZW5uaXx3c3BvbW5pZXxhdXRvYmlvZ3JhZnxrYXphfHJvem15xZtsfGxpc3R8aW50ZXJwcmV0YWNqIixYNjU1LCBpZ25vcmUuY2FzZSA9IFRSVUUpLCJ0YWsiLCJuaWUiKSkgJT4lDQojICAgZmlsdGVyKGthdGVnb3JpZV9saXRlcmFja2llPT0ibmllIikgJT4lDQojICAgbXV0YXRlKGxhdGEgPSBpZmVsc2UoZ3JlcGwoIlxcZHsyfS0iLFgxMDApLHN0cl9yZXBsYWNlKFgxMDAsIiguKlxcJGRcXCguKj8pKFxcZHsyLDR9KShcXD97MCwxfS0uKikiLCJcXDIiKSxOQSksDQojICAgICAgICAgIGxhdGFfdGVtYXQgPSBpZmVsc2UoZ3JlcGwoIlxcZHsyfS0iLFg2MDApLHN0cl9yZXBsYWNlKFg2MDAsIiguKlxcJGRcXCguKj8pKFxcZHsyLDR9KShcXD97MCwxfS0uKikiLCJcXDIiKSxOQSkpICU+JQ0KIyBmaWx0ZXIoKGlzLm5hKGxhdGEpJmlzLm5hKGxhdGFfdGVtYXQpKXwhKGFzLmludGVnZXIobGF0YSk8MTgwMCl8IShhcy5pbnRlZ2VyKGxhdGFfdGVtYXQpPDE4MDApKQ0KI2FrdHVhbGl6YWNqYSAtIHdwaXN6IHfFgmHFm2Npd3kgcm9rIHcgxZtjaWXFvGvEmSBwbGlrdQ0Kd3JpdGUuY3N2MihuYV9wb3puaWVqLCAiQzovVXNlcnMvQ2V6YXJ5L0Rlc2t0b3AvYm5fMjAxMV9rc19uYV9wb3puaWVqLmNzdiIsIHJvdy5uYW1lcyA9IEYsIG5hID0gJycsIGZpbGVFbmNvZGluZyA9ICdVVEYtOCcpDQoNCmJuX29rIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgZnJvbSBibl9vayBhDQogICAgICAgICAgICAgICB3aGVyZSBhLmlkIG5vdCBpbiAoc2VsZWN0IGIuaWQgZnJvbSBuYV9wb3puaWVqIGIpIikNCmNodW5rNyA8LSBibl9vaw0KYGBgDQoNCkN6eSBqZXN0IHNlbnMgdG8gcm9iacSHPw0KYGBge3IgYXV0b21hdHljem5lIGR6aWHFgm93YW5pZSBwcnplZG1pb3Rvd2VqfQ0KIyMjYXV0b21hdHljem5pZSBkemlhxYJvd2FuaWUgcHJ6ZWRtaW90b3dlaiBuYSBwb2RzdGF3aWUgZG90eWNoY3phc293eWNoIGltcG9ydMOzdw0KI3phcGlzeSA8LSBSSkRCQzo6ZGJHZXRRdWVyeShQQkwsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3Qgei56YV96YXBpc19pZCwgZHouZHpfZHppYWxfaWQsIGR6LmR6X25hendhLCB6LnphX3N0YXR1c19pbXAsIHouemFfdXdhZ2kNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwYmxfemFwaXN5IHoNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbiBwYmxfZHppYWx5IGR6IG9uIGR6LmR6X2R6aWFsX2lkPXouemFfZHpfZHppYWwxX2lkDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHouemFfdXdhZ2kgbGlrZSAnJWltcG9ydCUnIikgJT4lDQojICBtdXRhdGUocHJhY293bmlrX3BibCA9IHN0cl9leHRyYWN0KFpBX1VXQUdJLCAiKD88PWFrY2VwdHVqZTopKFtBLVpdKikiKSkgJT4lDQojICBzZWxlY3QoLVpBX1VXQUdJKQ0KIw0KI3BvcHJ6ZWRuaWVfaW1wb3J0eSA8LSByYmluZChsaXN0eV8yMDA0LGxpc3R5XzIwMDUsbGlzdHlfMjAwNixsaXN0eV8yMDA3LGxpc3R5XzIwMDgpICU+JQ0KIyAgZnVsbF9qb2luKC4semFwaXN5LGJ5ID0gIlpBX1pBUElTX0lEIikgJT4lDQojICBzZWxlY3QoWDY1MCxYNjU1LERaX0RaSUFMX0lELERaX05BWldBLFpBX1NUQVRVU19JTVApICU+JQ0KIyAgbXV0YXRlKFg2NTAgPSBzdHJfcmVtb3ZlX2FsbChYNjUwLCJcXFxcNyIpLA0KIyAgICAgICAgIFg2NTUgPSBzdHJfcmVtb3ZlX2FsbChYNjU1LCJcXFxcNyIpLA0KIyAgICAgICAgIFg2NTAgPSBzdHJfcmVtb3ZlX2FsbChzdHJfcmVwbGFjZV9hbGwoWDY1MCwiKFxcJGEpIiwiXFxcXCM3XFwxIiksIiMiKSwNCiMgICAgICAgICBYNjU1ID0gc3RyX3JlbW92ZV9hbGwoc3RyX3JlcGxhY2VfYWxsKFg2NTUsIihcXCRhKSIsIlxcXFwjN1xcMSIpLCIjIikpICU+JQ0KIyAgZ3JvdXBfYnlfYXQodmFycyhYNjUwOkRaX05BWldBKSkgJT4lDQojICBtdXRhdGUoWkFfU1RBVFVTX0lNUCA9IHBhc3RlKFpBX1NUQVRVU19JTVAsY29sbGFwc2UgPSAifCIpKSAlPiUNCiMgIHVuZ3JvdXAoKSAlPiUNCiMgIHVuaXF1ZSgpICU+JQ0KIyAgdW5ncm91cCgpICU+JQ0KIyAgZmlsdGVyKCFncmVwbCgiXFx8IixEWl9EWklBTF9JRCkpICU+JQ0KIyAgZmlsdGVyKGdyZXBsKCJJT0siLFpBX1NUQVRVU19JTVApKSAlPiUNCiMgIGZpbHRlcighZ3JlcGwoIklOT3xJTVB8SVBOfElQQyIsWkFfU1RBVFVTX0lNUCkpICU+JQ0KIyAgZmlsdGVyKCFncmVwbCgib3NvYm93ZSIsRFpfTkFaV0EpKSAlPiUNCiMgIGZpbHRlcighKGlzLm5hKFg2NTApJmlzLm5hKFg2NTUpKSkgJT4lDQojICBtdXRhdGUoaWxlNjUwID0gc3RyX2NvdW50KFg2NTAsIlxcfCIpKzEsDQojICAgICAgICAgaWxlNjU1ID0gc3RyX2NvdW50KFg2NTUsIlxcfCIpKzEpICU+JQ0KIyAgZmlsdGVyKGlsZTY1MDw9MTB8aWxlNjU1PD0xMCkgJT4lDQojICBzZWxlY3QoLWlsZTY1MCwtaWxlNjU1KSAlPiUNCiMgIG11dGF0ZShpbGVfc3RhdHVzb3cgPSBzdHJfY291bnQoWkFfU1RBVFVTX0lNUCwiXFx8IikrMSkgJT4lDQojICBhcnJhbmdlKFg2NTUsWDY1MCwtaWxlX3N0YXR1c293KQ0KI3BvcHJ6ZWRuaWVfaW1wb3J0eSRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQocG9wcnplZG5pZV9pbXBvcnR5WzE6Ml0pKQ0KI3BvcHJ6ZWRuaWVfaW1wb3J0eSA8LSBwb3ByemVkbmllX2ltcG9ydHlbIWR1cGxpY2F0ZWQocG9wcnplZG5pZV9pbXBvcnR5JGlkX2dydXB5KSxdICU+JQ0KIyAgbXV0YXRlKGlkID0gcm93X251bWJlcigpKSAlPiUNCiMgIHNlbGVjdCgtaWxlX3N0YXR1c293LC1pZF9ncnVweSkNCiMNCiNkb19kemlhbG93YW5pYSA8LSBkYXRhLmZyYW1lKGlkID0gYXMuaW50ZWdlcigpLCBYNjUwID0gYXMuY2hhcmFjdGVyKCksIFg2NTUgPSBhcy5jaGFyYWN0ZXIoKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KI3ggPC0gMTpsZW5ndGgocG9wcnplZG5pZV9pbXBvcnR5JGlkKQ0KI2ZvciAoaSBpbiB4KXsNCiMgIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQojICAgIGlmIChpcy5uYShwb3ByemVkbmllX2ltcG9ydHkkWDY1MFtpXSkmIWlzLm5hKHBvcHJ6ZWRuaWVfaW1wb3J0eSRYNjU1W2ldKSl7DQojICAgICAgcGVybXV0YXRpb25zIDwtIGFzLmRhdGEuZnJhbWUocGVybXV0YXRpb25zKHVubGlzdChzdHJfc3BsaXQocG9wcnplZG5pZV9pbXBvcnR5JFg2NTVbaV0sIlxcfCIpKSwgc3RyX2NvdW50KHBvcHJ6ZWRuaWVfaW1wb3J0eSRYNjU1W2ldLCJcXHwiKSsxKSkgJT4lDQojICAgICAgICB1bml0ZShkYXRhPS4sY29sID0gInBlcm11dGF0aW9uIiwgc2VwID0gInwiKSAlPiUNCiMgICAgICAgIG11dGF0ZShYNjUwID0gTkEsDQojICAgICAgICAgICAgICAgWDY1NSA9IHBlcm11dGF0aW9uLA0KIyAgICAgICAgICAgICAgIGlkID0gcG9wcnplZG5pZV9pbXBvcnR5JGlkW2ldKSAlPiUNCiMgICAgICAgIHNlbGVjdChpZCxYNjUwLFg2NTUpDQojICAgICAgZG9fZHppYWxvd2FuaWEgPC0gcmJpbmQoZG9fZHppYWxvd2FuaWEscGVybXV0YXRpb25zKQ0KIyAgICB9IGVsc2UgaWYgKGlzLm5hKHBvcHJ6ZWRuaWVfaW1wb3J0eSRYNjU1W2ldKSYhaXMubmEocG9wcnplZG5pZV9pbXBvcnR5JFg2NTBbaV0pKXsNCiMgICAgICBwZXJtdXRhdGlvbnMgPC0gYXMuZGF0YS5mcmFtZShwZXJtdXRhdGlvbnModW5saXN0KHN0cl9zcGxpdChwb3ByemVkbmllX2ltcG9ydHkkWDY1MFtpXSwiXFx8IikpLCBzdHJfY291bnQocG9wcnplZG5pZV9pbXBvcnR5JFg2NTBbaV0sIlxcfCIpKzEpKSAlPiUNCiMgICAgICAgIHVuaXRlKGRhdGE9Lixjb2wgPSAicGVybXV0YXRpb24iLCBzZXAgPSAifCIpICU+JQ0KIyAgICAgICAgbXV0YXRlKFg2NTAgPSBwZXJtdXRhdGlvbiwNCiMgICAgICAgICAgICAgICBYNjU1ID0gTkEsDQojICAgICAgICAgICAgICAgaWQgPSBwb3ByemVkbmllX2ltcG9ydHkkaWRbaV0pICU+JQ0KIyAgICAgICAgc2VsZWN0KGlkLFg2NTAsWDY1NSkNCiMgICAgICBkb19kemlhbG93YW5pYSA8LSByYmluZChkb19kemlhbG93YW5pYSxwZXJtdXRhdGlvbnMpDQojICAgIH0gZWxzZSB7DQojICAgICAgcGVybXV0YXRpb25zIDwtIGFzLmRhdGEuZnJhbWUocGVybXV0YXRpb25zKHVubGlzdChzdHJfc3BsaXQocG9wcnplZG5pZV9pbXBvcnR5JFg2NTBbaV0sIlxcfCIpKSwgc3RyX2NvdW50KHBvcHJ6ZWRuaWVfaW1wb3J0eSRYNjUwW2ldLCJcXHwiKSsxKSkgJT4lDQojICAgICAgICB1bml0ZShkYXRhPS4sY29sID0gInBlcm11dGF0aW9uIiwgc2VwID0gInwiKSAlPiUNCiMgICAgICAgIG11dGF0ZShYNjUwID0gcGVybXV0YXRpb24sDQojICAgICAgICAgICAgICAgaWQgPSBwb3ByemVkbmllX2ltcG9ydHkkaWRbaV0pICU+JQ0KIyAgICAgICAgc2VsZWN0KGlkLFg2NTApDQojICAgICAgcGVybXV0YXRpb25zNjUwIDwtIGRhdGEuZnJhbWUoc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KIyAgICAgIHBlcm11dGF0aW9uczY1MCA8LSByYmluZChwZXJtdXRhdGlvbnM2NTAscGVybXV0YXRpb25zKQ0KIyAgICAgIHBlcm11dGF0aW9ucyA8LSBhcy5kYXRhLmZyYW1lKHBlcm11dGF0aW9ucyh1bmxpc3Qoc3RyX3NwbGl0KHBvcHJ6ZWRuaWVfaW1wb3J0eSRYNjU1W2ldLCJcXHwiKSksIHN0cl9jb3VudChwb3ByemVkbmllX2ltcG9ydHkkWDY1NVtpXSwiXFx8IikrMSkpICU+JQ0KIyAgICAgICAgdW5pdGUoZGF0YT0uLGNvbCA9ICJwZXJtdXRhdGlvbiIsIHNlcCA9ICJ8IikgJT4lDQojICAgICAgICBtdXRhdGUoWDY1NSA9IHBlcm11dGF0aW9uLA0KIyAgICAgICAgICAgICAgIGlkID0gcG9wcnplZG5pZV9pbXBvcnR5JGlkW2ldKSAlPiUNCiMgICAgICAgIHNlbGVjdChpZCxYNjU1KQ0KIyAgICAgIHBlcm11dGF0aW9uczY1NSA8LSBkYXRhLmZyYW1lKHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCiMgICAgICBwZXJtdXRhdGlvbnM2NTUgPC0gcmJpbmQocGVybXV0YXRpb25zNjU1LHBlcm11dGF0aW9ucykNCiMgICAgICBwZXJtdXRhdGlvbnMgPC0gbWVyZ2UocGVybXV0YXRpb25zNjUwLHBlcm11dGF0aW9uczY1NSxieSA9ICJpZCIsYWxsID0gVFJVRSkgJT4lDQojICAgICAgICBzZWxlY3QoaWQsWDY1MCxYNjU1KQ0KIyAgICAgIGRvX2R6aWFsb3dhbmlhIDwtIHJiaW5kKGRvX2R6aWFsb3dhbmlhLHBlcm11dGF0aW9ucykNCiMgICAgfQ0KI30NCiMNCiNkb19kemlhbG93YW5pYSA8LSBkb19kemlhbG93YW5pYSAlPiUNCiMgIGZ1bGxfam9pbiguLHBvcHJ6ZWRuaWVfaW1wb3J0eSAlPiUgc2VsZWN0KGlkLERaX0RaSUFMX0lELERaX05BWldBKSxieSA9ICJpZCIpICU+JQ0KIyAgc2VsZWN0KC1pZCkNCiNkb19kemlhbG93YW5pYVtpcy5uYShkb19kemlhbG93YW5pYSldIDwtICIiDQojIyMjI3R1dGFqIHNwcmF3ZHppxIcNCiNkb19kemlhbG93YW5pYV9wcnplZG0gPC0gbWVyZ2UoYm5fb2sgJT4lIGZpbHRlcihjenlfYXV0b21hdHljem5pZT09Im5pZSImcm9kemFqX2tzaWF6a2k9PSJwcnplZG1pb3Rvd2EiKSxkb19kemlhbG93YW5pYSwgYnkgPSBjKCJYNjUwIiwiWDY1NSIpKSAlPiUNCiMgIHNlbGVjdChpZCxEWl9EWklBTF9JRCxEWl9OQVpXQSkNCmBgYA0KDQpgYGB7ciB3Y3p5dGFuaWUgZGFueWNoIFBCTH0NCiN3Y3p5dGFuaWUga2FydG90ZWsgUEJMDQpyZWRha3Rvcnp5X2R6aWFsb3cgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMUJhamUtWmZQZ0FLRURBb0R6ZW9fZUNCRHJzTDdqQVh0NnViUDJjZWRiRmMiLCBzaGVldCA9ICJyZWRha3Rvcnp5X2R6aWHFgsOzdyIpICU+JQ0KICBzZWxlY3QoRFpfRFpJQUxfSUQsIERaX05BWldBLCByZWRha3Rvcl9kemlhbHUpICMlPiUNCiAgI211dGF0ZShEWl9EWklBTF9JRCA9IGFzLmNoYXJhY3RlcihEWl9EWklBTF9JRCkpDQoNClBCTF9kemlhbHkgPC0gZGJSZWFkVGFibGUoUEJMLCdQQkxfRFpJQUxZJykgJT4lDQogIHNlbGVjdCgxLDMsNikNCg0KUEJMX2R6aWFseV9wYXRoIDwtIG1lcmdlKHggPSBQQkxfZHppYWx5LCB5ID0gUEJMX2R6aWFseSwgYnkueCA9ICJEWl9EWl9EWklBTF9JRCIsIGJ5LnkgPSAiRFpfRFpJQUxfSUQiLCBhbGwueCA9IFRSVUUpDQpjb2xuYW1lcyhQQkxfZHppYWx5X3BhdGgpIDwtIGMoIk5BRF9EWl9EWklBTF9JRCIsICJEWl9EWklBTF9JRCIsICJEWl9OQVpXQSIsICJOQURfRFpfTkFaV0EiLCAiTkFEX05BRF9EWl9EWklBTF9JRCIpDQoNClBCTF9kemlhbHlfcGF0aCA8LSBtZXJnZSh4ID0gUEJMX2R6aWFseV9wYXRoLCB5ID0gUEJMX2R6aWFseSwgYnkueCA9ICJOQURfTkFEX0RaX0RaSUFMX0lEIiwgYnkueSA9ICJEWl9EWklBTF9JRCIsIGFsbC54ID0gVFJVRSkNCmNvbG5hbWVzKFBCTF9kemlhbHlfcGF0aCkgPC0gYygiTkFEX05BRF9EWl9EWklBTF9JRCIsICJOQURfRFpfRFpJQUxfSUQiLCAiRFpfRFpJQUxfSUQiLCAiRFpfTkFaV0EiLCAiTkFEX0RaX05BWldBIiwgIk5BRF9OQURfRFpfTkFaV0EiLCAiTkFEX05BRF9OQURfRFpfRFpJQUxfSUQiKQ0KDQpQQkxfZHppYWx5X3BhdGggPC0gbWVyZ2UoeCA9IFBCTF9kemlhbHlfcGF0aCwgeSA9IFBCTF9kemlhbHksIGJ5LnggPSAiTkFEX05BRF9OQURfRFpfRFpJQUxfSUQiLCBieS55ID0gIkRaX0RaSUFMX0lEIiwgYWxsLnggPSBUUlVFKQ0KY29sbmFtZXMoUEJMX2R6aWFseV9wYXRoKSA8LSBjKCJOQURfTkFEX05BRF9EWl9EWklBTF9JRCIsICJOQURfTkFEX0RaX0RaSUFMX0lEIiwgIk5BRF9EWl9EWklBTF9JRCIsICJEWl9EWklBTF9JRCIsICJEWl9OQVpXQSIsICJOQURfRFpfTkFaV0EiLCAiTkFEX05BRF9EWl9OQVpXQSIsICJOQURfTkFEX05BRF9EWl9OQVpXQSIsICJOQURfTkFEX05BRF9OQURfRFpfRFpJQUxfSUQiKQ0KDQpQQkxfZHppYWx5X3BhdGggPC0gbWVyZ2UoeCA9IFBCTF9kemlhbHlfcGF0aCwgeSA9IFBCTF9kemlhbHksIGJ5LnggPSAiTkFEX05BRF9OQURfTkFEX0RaX0RaSUFMX0lEIiwgYnkueSA9ICJEWl9EWklBTF9JRCIsIGFsbC54ID0gVFJVRSkNCmNvbG5hbWVzKFBCTF9kemlhbHlfcGF0aCkgPC0gYygiTkFEX05BRF9OQURfTkFEX0RaX0RaSUFMX0lEIiwgIk5BRF9OQURfTkFEX0RaX0RaSUFMX0lEIiwgIk5BRF9OQURfRFpfRFpJQUxfSUQiLCAiTkFEX0RaX0RaSUFMX0lEIiwgIkRaX0RaSUFMX0lEIiwgIkRaX05BWldBIiwgIk5BRF9EWl9OQVpXQSIsICJOQURfTkFEX0RaX05BWldBIiwgIk5BRF9OQURfTkFEX0RaX05BWldBIiwgIk5BRF9OQURfTkFEX05BRF9EWl9OQVpXQSIsICJOQURfTkFEX05BRF9OQURfTkFEX0RaX0RaSUFMX0lEIikNCg0KUEJMX2R6aWFseV9wYXRoIDwtIG1lcmdlKHggPSBQQkxfZHppYWx5X3BhdGgsIHkgPSBQQkxfZHppYWx5LCBieS54ID0gIk5BRF9OQURfTkFEX05BRF9OQURfRFpfRFpJQUxfSUQiLCBieS55ID0gIkRaX0RaSUFMX0lEIiwgYWxsLnggPSBUUlVFKQ0KY29sbmFtZXMoUEJMX2R6aWFseV9wYXRoKSA8LSBjKCJOQURfTkFEX05BRF9OQURfTkFEX0RaX0RaSUFMX0lEIiwgIk5BRF9OQURfTkFEX05BRF9EWl9EWklBTF9JRCIsICJOQURfTkFEX05BRF9EWl9EWklBTF9JRCIsICJOQURfTkFEX0RaX0RaSUFMX0lEIiwgIk5BRF9EWl9EWklBTF9JRCIsICJEWl9EWklBTF9JRCIsICJEWl9OQVpXQSIsICJOQURfRFpfTkFaV0EiLCAiTkFEX05BRF9EWl9OQVpXQSIsICJOQURfTkFEX05BRF9EWl9OQVpXQSIsICJOQURfTkFEX05BRF9OQURfRFpfTkFaV0EiLCAiTkFEX05BRF9OQURfTkFEX05BRF9EWl9OQVpXQSIsICJOQURfTkFEX05BRF9OQURfTkFEX05BRF9EWl9EWklBTF9JRCIpDQoNClBCTF9kemlhbHlfcGF0aCA8LSBQQkxfZHppYWx5X3BhdGggJT4lDQogIHNlbGVjdCgtbGVuZ3RoKFBCTF9kemlhbHlfcGF0aCkpICU+JQ0KICBmaWx0ZXIoRFpfRFpJQUxfSUQhPTApICU+JQ0KICBzZWxlY3QoNiw3LDUsOCw0LDksMywxMCwyLDExLDEsMTIpICU+JQ0KICB1bmlxdWUoKQ0KDQpQQkxfZHpfb3NvYiA8LSBQQkxfZHppYWx5X3BhdGggJT4lDQogIGZpbHRlcihncmVwbCgib3NvYm93ZSIsIERaX05BWldBKXxncmVwbCgib3NvYm93ZSIsIE5BRF9EWl9OQVpXQSl8Z3JlcGwoIm9zb2Jvd2UiLCBOQURfTkFEX0RaX05BWldBKXxncmVwbCgib3NvYm93ZSIsIE5BRF9OQURfTkFEX0RaX05BWldBKXxncmVwbCgib3NvYm93ZSIsIE5BRF9OQURfTkFEX05BRF9EWl9OQVpXQSl8Z3JlcGwoIm9zb2Jvd2UiLCBOQURfTkFEX05BRF9OQURfTkFEX0RaX05BWldBKSkgJT4lDQogIHNlbGVjdCgxLDIsMyw0LDUsNiw3LDgpICU+JQ0KICBmaWx0ZXIoRFpfRFpJQUxfSUQhPTE0OCkNCg0KUEJMX2R6X29zb2JfMSA8LSBQQkxfZHpfb3NvYiAlPiUNCiAgc2VsZWN0KDEsMiwzLDQpDQpQQkxfZHpfb3NvYl8yIDwtIFBCTF9kel9vc29iICU+JQ0KICBzZWxlY3QoMSwyLDUsNikNClBCTF9kel9vc29iXzMgPC0gUEJMX2R6X29zb2IgJT4lDQogIHNlbGVjdCgxLDIsNyw4KQ0KY29sbmFtZXMoUEJMX2R6X29zb2JfMikgPC0gYyhuYW1lcyhQQkxfZHpfb3NvYl8xKSkNCmNvbG5hbWVzKFBCTF9kel9vc29iXzMpIDwtIGMobmFtZXMoUEJMX2R6X29zb2JfMSkpDQpQQkxfZHpfb3NvYiA8LSByYmluZChQQkxfZHpfb3NvYl8xLFBCTF9kel9vc29iXzIsUEJMX2R6X29zb2JfMykgJT4lDQogIGZpbHRlcighaXMubmEoTkFEX0RaX0RaSUFMX0lEKSkgJT4lDQogIHVuaXF1ZSgpDQpQQkxfZHpfb3NvYiA8LSByYmluZChQQkxfZHpfb3NvYiwgYygiMTUwNDMiLCAiSGFzxYJhIG9zb2Jvd2UobHVrc2VtYnVyc2thKSIsIjE1MDQzIiwgIkhhc8WCYSBvc29ib3dlKGx1a3NlbWJ1cnNrYSkiKSwgYygiNDMwIiwgIkhhc8WCYSBvc29ib3dlIChMdWR6aWUgdGVhdHJ1IGkgZmlsbXUpIiwiNDMwIiwgIkhhc8WCYSBvc29ib3dlIChMdWR6aWUgdGVhdHJ1IGkgZmlsbXUpIikpDQpQQkxfZHpfb3NvYl9iZXpfdGVhdHJ1IDwtIFBCTF9kel9vc29iICU+JQ0KICBmaWx0ZXIoRFpfRFpJQUxfSUQhPTQzMCkNCg0KUEJMX3R3b3JjeSA8LSBkYlJlYWRUYWJsZShQQkwsJ1BCTF9UV09SQ1knKQ0KdHdfaV9kel9wb2RtIDwtIG1lcmdlKHg9UEJMX3R3b3JjeSx5PVBCTF9kel9vc29iX2Jlel90ZWF0cnUsIGJ5LnggPSAiVFdfRFpfRFpJQUxfSUQiLCBieS55ID0gIk5BRF9EWl9EWklBTF9JRCIsIGFsbC54ID0gVFJVRSkgJT4lDQogIGFycmFuZ2UoVFdfVFdPUkNBX0lEKQ0KDQp0d19pX2R6X3BvZG0gPC0gZGF0YS5mcmFtZSh0d19pX2R6X3BvZG0sIHBvbF9vc29iID0gaWZlbHNlKHR3X2lfZHpfcG9kbSRUV19EWl9EWklBTF9JRCA9PSAxNDggJiBzdWJzdHIodHdfaV9kel9wb2RtJFRXX05BWldJU0tPLDEsMSk9PXN0cl9zdWIodHdfaV9kel9wb2RtJERaX05BWldBLG5jaGFyKGFzLmNoYXJhY3Rlcih0d19pX2R6X3BvZG0kRFpfTkFaV0EpKSxuY2hhcihhcy5jaGFyYWN0ZXIodHdfaV9kel9wb2RtJERaX05BWldBKSkpLFRSVUUsRkFMU0UpLCBwb2wgPSBpZmVsc2UodHdfaV9kel9wb2RtJFRXX0RaX0RaSUFMX0lEID09IDE0OCwgVFJVRSwgRkFMU0UpKSAlPiUNCiAgZmlsdGVyKHBvbF9vc29iID09IFRSVUUgfCBwb2wgPT0gRkFMU0UpDQpQQkxfdHdvcmN5X3BvZG0gPC0gdHdfaV9kel9wb2RtICU+JQ0KICBzZWxlY3QoVFdfVFdPUkNBX0lELCBUV19OQVpXSVNLTywgVFdfSU1JRSwgRFpfRFpJQUxfSUQsIERaX05BWldBLCBUV19OQVpXX1dMQVNDSVdFLCBUV19QU0VVRE9OSU1ZLCBUV19EQVRBX1VST0RaSU4sIFRXX0RBVEFfWkdPTlUsIFRXX1JPQ1pOSUtJX1BCTCwgVFdfU0xPV0FfS0xVQ1pPV0UsIFRXX1VXQUdJLCBUV19ST0tfVVJPRFpJTiwgVFdfUk9LX1pHT05VLCBUV19MSUNaQkFfWkFQSVNPVywgVFdfQUROT1RBQ0pFLCBUV19UUkFOU0xJVEVSQUNKRSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKQ0KY29sbmFtZXMoUEJMX3R3b3JjeV9wb2RtKSA8LSBjKCJUV19UV09SQ0FfSUQiLCAiVFdfTkFaV0lTS08iLCAiVFdfSU1JRSIsICJUV19EWl9EWklBTF9JRCIsICJEWl9OQVpXQSIsICJUV19OQVpXX1dMQVNDSVdFIiwgIlRXX1BTRVVET05JTVkiLCAiVFdfREFUQV9VUk9EWklOIiwgIlRXX0RBVEFfWkdPTlUiLCAiVFdfUk9DWk5JS0lfUEJMIiwgIlRXX1NMT1dBX0tMVUNaT1dFIiwgIlRXX1VXQUdJIiwgIlRXX1JPS19VUk9EWklOIiwgIlRXX1JPS19aR09OVSIsICJUV19MSUNaQkFfWkFQSVNPVyIsICJUV19BRE5PVEFDSkUiLCAiVFdfVFJBTlNMSVRFUkFDSkUiKQ0KUEJMX3R3b3JjeV9wb2RtIDwtIFBCTF90d29yY3lfcG9kbSAlPiUNCiAgbXV0YXRlKG5hendhID0gaWZlbHNlKGlzLm5hKFRXX0lNSUUpLGFzLmNoYXJhY3RlcihUV19OQVpXSVNLTykscGFzdGUoVFdfTkFaV0lTS08sVFdfSU1JRSwgc2VwID0gIiIpKSwNCiAgICAgICAgIG5hendhID0gc3RyX3RvX2xvd2VyKHN0cl9yZXBsYWNlX2FsbChuYXp3YSwgIlxcVyIsICIiKSksDQogICAgICAgICBuYXp3YSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIobmF6d2EpLCAiXFxXIiwgIiIpKQ0KDQp0d19pX2R6IDwtIG1lcmdlKHg9UEJMX3R3b3JjeSx5PVBCTF9kel9vc29iLCBieS54ID0gIlRXX0RaX0RaSUFMX0lEIiwgYnkueSA9ICJOQURfRFpfRFpJQUxfSUQiLCBhbGwueCA9IFRSVUUpICU+JQ0KICBhcnJhbmdlKFRXX1RXT1JDQV9JRCkNCnR3X2lfZHogPC0gZGF0YS5mcmFtZSh0d19pX2R6LCBwb2xfb3NvYiA9IGlmZWxzZSh0d19pX2R6JFRXX0RaX0RaSUFMX0lEID09IDE0OCAmIHN1YnN0cih0d19pX2R6JFRXX05BWldJU0tPLDEsMSk9PXN0cl9zdWIodHdfaV9keiREWl9OQVpXQSxuY2hhcihhcy5jaGFyYWN0ZXIodHdfaV9keiREWl9OQVpXQSkpLG5jaGFyKGFzLmNoYXJhY3Rlcih0d19pX2R6JERaX05BWldBKSkpLFRSVUUsRkFMU0UpLCBwb2wgPSBpZmVsc2UodHdfaV9keiRUV19EWl9EWklBTF9JRCA9PSAxNDgsIFRSVUUsIEZBTFNFKSkgJT4lDQogIGZpbHRlcihwb2xfb3NvYiA9PSBUUlVFIHwgcG9sID09IEZBTFNFKQ0KUEJMX3R3b3JjeSA8LSB0d19pX2R6ICU+JQ0KICBzZWxlY3QoVFdfVFdPUkNBX0lELCBUV19OQVpXSVNLTywgVFdfSU1JRSwgRFpfRFpJQUxfSUQsIERaX05BWldBLCBUV19OQVpXX1dMQVNDSVdFLCBUV19QU0VVRE9OSU1ZLCBUV19EQVRBX1VST0RaSU4sIFRXX0RBVEFfWkdPTlUsIFRXX1JPQ1pOSUtJX1BCTCwgVFdfU0xPV0FfS0xVQ1pPV0UsIFRXX1VXQUdJLCBUV19ST0tfVVJPRFpJTiwgVFdfUk9LX1pHT05VLCBUV19MSUNaQkFfWkFQSVNPVywgVFdfQUROT1RBQ0pFLCBUV19UUkFOU0xJVEVSQUNKRSkNCmNvbG5hbWVzKFBCTF90d29yY3kpIDwtIGMoIlRXX1RXT1JDQV9JRCIsICJUV19OQVpXSVNLTyIsICJUV19JTUlFIiwgIlRXX0RaX0RaSUFMX0lEIiwgIkRaX05BWldBIiwgIlRXX05BWldfV0xBU0NJV0UiLCAiVFdfUFNFVURPTklNWSIsICJUV19EQVRBX1VST0RaSU4iLCAiVFdfREFUQV9aR09OVSIsICJUV19ST0NaTklLSV9QQkwiLCAiVFdfU0xPV0FfS0xVQ1pPV0UiLCAiVFdfVVdBR0kiLCAiVFdfUk9LX1VST0RaSU4iLCAiVFdfUk9LX1pHT05VIiwgIlRXX0xJQ1pCQV9aQVBJU09XIiwgIlRXX0FETk9UQUNKRSIsICJUV19UUkFOU0xJVEVSQUNKRSIpDQpQQkxfdHdvcmN5IDwtIFBCTF90d29yY3kgJT4lDQogIG11dGF0ZShuYXp3YSA9IGlmZWxzZShpcy5uYShUV19JTUlFKSxhcy5jaGFyYWN0ZXIoVFdfTkFaV0lTS08pLHBhc3RlKFRXX05BWldJU0tPLFRXX0lNSUUsIHNlcCA9ICIiKSksDQogICAgICAgICBuYXp3YSA9IHN0cl90b19sb3dlcihzdHJfcmVwbGFjZV9hbGwobmF6d2EsICJcXFciLCAiIikpLA0KICAgICAgICAgbmF6d2EgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKG5hendhKSwgIlxcVyIsICIiKSwNCiAgICAgICAgIFRXX0RaX0RaSUFMX0lEID0gYXMubnVtZXJpYyhUV19EWl9EWklBTF9JRCkpDQoNClBCTF9hdXRvcnp5IDwtIGRiUmVhZFRhYmxlKFBCTCwnUEJMX0FVVE9SWlknKSAlPiUNCiAgbXV0YXRlKG5hendhID0gaWZlbHNlKGlzLm5hKEFNX0lNSUUpLGFzLmNoYXJhY3RlcihBTV9OQVpXSVNLTykscGFzdGUoQU1fTkFaV0lTS08sQU1fSU1JRSwgc2VwID0gIiIpKSwNCiAgICAgICAgIG5hendhID0gc3RyX3RvX2xvd2VyKHN0cl9yZXBsYWNlX2FsbChuYXp3YSwgIlxcVyIsICIiKSksDQogICAgICAgICBuYXp3YSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIobmF6d2EpLCAiXFxXIiwgIiIpKSAlPiUNCiAgZmlsdGVyKG5hendhICE9ICJuYW5hIikNCg0KUEJMX3dzcG9sdHdvcmN5IDwtIGRiUmVhZFRhYmxlKFBCTCwnUEJMX09TT0JZJykgJT4lDQogIG11dGF0ZShuYXp3YV9wcm9zdGEgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKGlmZWxzZShpcy5uYShPU19JTUlFKSxhcy5jaGFyYWN0ZXIoT1NfTkFaV0lTS08pLHBhc3RlKE9TX05BWldJU0tPLE9TX0lNSUUsIHNlcCA9ICIiKSkpLCAiXFxXIiwgIiIpKSAlPiUNCiAgZmlsdGVyKG5hendhX3Byb3N0YSAhPSJuYW5hIikNCg0KUEJMX2Z1bmtjamUgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMWh0bl9MNlJFczNHZEcxeFNpR0hJZnI2TUp2am1tVV9rVkd4aU1adENWMjQiLCBzaGVldCA9ICJBcmt1c3oxIikNCg0KUEJMX3d5ZGF3bmljdHdhIDwtIGRiUmVhZFRhYmxlKFBCTCwnUEJMX1dZREFXTklDVFdBJykgJT4lDQogIG11dGF0ZShuYXp3YV9wcm9zdGEgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKHBhc3RlKFdZX01JQVNUTywgV1lfTkFaV0EpKSwgIlxcVyIsICIiKSkgJT4lDQogIGZpbHRlcihuYXp3YV9wcm9zdGEgIT0ibmFuYSIpDQoNClBCTF9yb2R6YWplX3phcGlzb3cgPC0gZGJSZWFkVGFibGUoUEJMLCdQQkxfUk9EWkFKRV9aQVBJU09XJykNCg0KQk5fUEJMX2xpc3RhX2xpdGVyYXR1ciA8LSBzaGVldHNfcmVhZChzcyA9ICIxemJ3am5ydFdHdmJqclFUTE1hdkpjV1N1N0hmUDBJLVVTTmdaX0tXaVhqYyIsIHNoZWV0ID0gImxpc3RhIHVrZCBibiIpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHVrZF9vZ29sbmUpKSAlPiUNCiAgc2VsZWN0KDM6OSkgJT4lDQogIGNTcGxpdCguLGMoInBibF9pZCIsInBibF9uYXp3YSIsInJlZGFrdG9yX2R6aWFsdSIsInBibF9pZF9saXRlcmF0dXJ5IiwicGJsX2xpdGVyYXR1cmEiKSxzZXAgPSAifCIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShwYmxfaWQpKQ0KDQpQQkxfaGFzbGFfb3NvYm93ZSA8LSBzaGVldHNfcmVhZChzcyA9ICIxemJ3am5ydFdHdmJqclFUTE1hdkpjV1N1N0hmUDBJLVVTTmdaX0tXaVhqYyIsIHNoZWV0ID0gInBibF9oYXNsYV9vc29ib3dlIikgJT4lDQogIHNlbGVjdCgyOjUpDQpjb2xuYW1lcyhQQkxfaGFzbGFfb3NvYm93ZSkgPC0gYygiRFpfRFpJQUxfSUQiLCJEWl9OQVpXQSIsInJlZGFrdG9yX2R6aWFsdSIsIm5hendhIikNCmBgYA0KDQpgYGB7ciBwcnp5Z290b3dhbmllIHdzcMOzxYJ3eWRhxYR9DQpibl9vayA8LSBjaHVuazcNCiMgcG9kemllbGVuaWUgdW5pa2F0b3d5Y2ggcmVrb3Jkw7N3IGJuIG5hIGR3YSB3aWVyc3plIHcgdGFiZWxpLCB6IGt0w7NyeWNoIHBvd3N0YW7EhSBkd2EgcmVrb3JkeSBwYmwNCmJuX29rIDwtIGJuX29rICU+JQ0KICBtdXRhdGUoWkFfVVdBR0kgPSAxOm5yb3coLikpDQoNCndzcG9sd3lkYW5pYV9maXggPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09IndzcMOzxYJ3eWRhbmllIikgJT4lDQogIG11dGF0ZShYMjQ1ID0gaWZlbHNlKGdyZXBsKCJcXF1cXC5bXiRdIixYMjQ1KSxzdHJfcmVwbGFjZShYMjQ1LCIoXFwkYykoLiopKFxcXVxcLiApKC4qIFxcLyAuKikiLCJcXDFcXDJdfDEwJGFcXDQiKSxzdHJfcmVwbGFjZShYMjQ1LCIoXFwkYykoLio/KSg/PCF0xYJ8cmVkKShcXC4gKSguKiBcXC8gLiopIiwiXFwxXFwyfDEwJGFcXDQiKSksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsICJcXC9bXlxcJF0iLCAiLyRjIikpDQoNCiMgdXN1bmnEmWNpZSB6ZSB6YmlvcnUgd3Nww7PFgnd5ZGF3bmljdHcgKGLEmWTEhSBww7PFum5pZWogcG/FgsSFY3pvbmUpDQpibl9vayA8LSBibl9vayAlPiUgDQogIGZpbHRlcihpZCAlbm90aW4lIHdzcG9sd3lkYW5pYV9maXgkaWQpDQoNCiMgdXN1bmnEmWNpZSB6IHBvbGEgWDI0NiB3ZXJzamkgdHl0dcWCw7N3LCBrdMOzcmUgbmllIHPEhSB0eXR1xYJhbWkgb3J5Z2luYcWCdQ0KbWFyY19maWVsZF8yNDYgPC0gd3Nwb2x3eWRhbmlhX2ZpeCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDYpJT4lDQogIG11dGF0ZShYMjQ2PXN0cl9yZXBsYWNlX2FsbChYMjQ2LCIoXnxcXHwpIiwiflxcMSIpLA0KICAgICAgICAgWDI0NiA9IGlmZWxzZShYMjQ2PT0ifiIsYXMuY2hhcmFjdGVyKFgyNDYpLHN0cl9yZW1vdmUoWDI0NiwiXn4iKSkpICU+JQ0KICBjU3BsaXQoLiwiWDI0NiIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIG11dGF0ZShYMjQ2PXN0cl9yZW1vdmVfYWxsKFgyNDYsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbCh3c3BvbHd5ZGFuaWFfZml4JFgyNDYsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDYpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ2PC1jYmluZChtYXJjX2ZpZWxkXzI0NixlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NiRYMjQ2IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ2JFgyNDYsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ2WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ2JFgyNDYpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NiRYMjQ2KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzI0NiA8LSBtYXJjX2ZpZWxkXzI0NlssIGNvbFN1bXMoaXMubmEobWFyY19maWVsZF8yNDYpKSAhPSBucm93KG1hcmNfZmllbGRfMjQ2KV0NCm1hcmNfZmllbGRfMjQ2IDwtIG1hcmNfZmllbGRfMjQ2ICU+JSANCiAgZmlsdGVyKGlzLm5hKGAkaWApfGAkaWAhPSJUeXQuIHByemVrxYIuOiIpICU+JSANCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDYpICU+JSANCiAgbXV0YXRlKFgyNDYgPSBzdHJfcmVtb3ZlX2FsbChYMjQ2LCJcXHwiKSkgJT4lIA0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lIA0KICBtdXRhdGUoWDI0NiA9IHBhc3RlKFgyNDYsY29sbGFwc2UgPSAifCIpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHVuaXF1ZSgpDQoNCndzcG9sd3lkYW5pYV9maXgkWDI0NiA8LSBtYXJjX2ZpZWxkXzI0NiRYMjQ2DQoNCiMgcG9kemlhxYIgbmEgZHdhIHJla29yZHkNCndzcG9sd3lkYW5pYV9maXggPC0gd3Nwb2x3eWRhbmlhX2ZpeCAlPiUNCiAgY1NwbGl0KGMoIlgyNDUiLCAiWDI0NiIpLCBzZXAgPSAifCIsIGRpcmVjdGlvbiA9ICJsb25nIikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKFgyNDUpKQ0KDQojIHptaWFuYSBwb2xhIFpBX1VXQUdJIG5hIHdhcnRvxZvEhyB1bmlrYXRvd8SFDQp3c3BvbHd5ZGFuaWFfZml4ICUkJSAgDQogICAgeyBaQV9VV0FHST09bGFnKFpBX1VXQUdJLCl9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiB3c3BvbHd5ZGFuaWFfZml4JHNhbWUNCndzcG9sd3lkYW5pYV9maXgkc2FtZVsxXSA8LSAwDQp3c3BvbHd5ZGFuaWFfZml4IDwtIHdzcG9sd3lkYW5pYV9maXggJT4lIA0KICBtdXRhdGUoWkFfVVdBR0kgPSBpZmVsc2Uoc2FtZSA9PSAwLCBwYXN0ZShyb2ssc3ByaW50ZigiJTA1ZCIsIGFzLmludGVnZXIoWkFfVVdBR0kpKSwgIjAiLCBzZXAgPSAiIiksIHBhc3RlKHJvayxzcHJpbnRmKCIlMDVkIiwgYXMuaW50ZWdlcihaQV9VV0FHSSkpLCAiMSIsIHNlcCA9ICIiKSkpICU+JSANCiAgc2VsZWN0KC1zYW1lKQ0KDQojIHBvxYLEhWN6ZW5pZSB6YmlvcsOzdw0KYm5fb2sgPC0gYm5fb2sgJT4lIA0KICBtdXRhdGUoWkFfVVdBR0kgPSBwYXN0ZShyb2ssc3ByaW50ZigiJTA1ZCIsIGFzLmludGVnZXIoWkFfVVdBR0kpKSxzZXAgPSAiIikpICU+JSANCiAgYmluZF9yb3dzKHdzcG9sd3lkYW5pYV9maXgpDQpjaHVuazEwIDwtIGJuX29rDQpgYGANCg0KDQpgYGB7ciBwcnp5cGlzYW5pZSByZWRha3RvcsOzdyBkbyBwcnplZG1pb3Rvd2VqLCBwb2RtaW90b3dlaiBpIGFudG9sb2dpaX0NCmJuX29rIDwtIGNodW5rMTANCnByemVkbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwcnplZG1pb3Rvd2EiKQ0KIyMjcHJ6eXBpc2FuaWUgcmVkYWt0b3JhIG5hIHBvZHN0YXdpZSBvc29ieSB6IDYwMCBqYWtvIHRlbWF0dSAtIGtzacSFxbxraSBvIHR3w7NyY3kNCiM2MDANCm1hcmNfZmllbGRfNjAwIDwtIHByemVkbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDYwMCklPiUNCiAgZmlsdGVyKFg2MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2MDA9c3RyX3JlcGxhY2VfYWxsKFg2MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDYwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjAwIT0iIikgJT4lDQogIG11dGF0ZShYNjAwPXN0cl9yZW1vdmVfYWxsKFg2MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDYwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSRYNjAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzYwMDwtY2JpbmQobWFyY19maWVsZF82MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF82MDAkWDYwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzYwMCRYNjAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzYwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzYwMCRYNjAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF82MDAkWDYwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF82MDAgPC0gbWFyY19maWVsZF82MDAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgLGAkZGAsYCRjYCkgJT4lDQogIG11dGF0ZShuYW1lID0gaWZlbHNlKCFpcy5uYShgJGNgKSZzdWJzdHIoYCRjYCxuY2hhcihgJGNgKSxuY2hhcihgJGNgKSk9PSI7IixwYXN0ZShgJGFgLGAkY2AsYCRkYCxzZXAgPSAiICIpLGlmZWxzZSghaXMubmEoYCRkYCkscGFzdGUoYCRhYCxgJGRgLHNlcCA9ICIgIiksYXMuY2hhcmFjdGVyKGAkYWApKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksbmFtZSkgJT4lDQogIG11dGF0ZShuYW1lID0gc3RyX3JlcGxhY2UobmFtZSwiKFxcKSkoXFwuJCkiLCJcXDEiKSwNCiAgICAgICAgIG5hbWUgPSBzdHJfcmVwbGFjZShuYW1lLCAiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiLCJcXDEiKSkNCg0KbWFyY19maWVsZF82MDAgPC0gbWFyY19maWVsZF82MDAgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBpbm5lcl9qb2luKC4scGJsX3ZpYWYsYnkgPSBjKCJuYW1lIiA9ICJCTl9uYW1lIikpICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfdHdvcmN5LGJ5ID0gYygicGJsX2lkIj0iVFdfVFdPUkNBX0lEIikpICU+JQ0KICBsZWZ0X2pvaW4oLixyZWRha3Rvcnp5X2R6aWFsb3csYnkgPSBjKCJUV19EWl9EWklBTF9JRCI9IkRaX0RaSUFMX0lEIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksVFdfVFdPUkNBX0lEPXBibF9pZCxUV19OQVpXSVNLTyxUV19JTUlFLFRXX0RaX0RaSUFMX0lELERaX05BWldBPURaX05BWldBLngscmVkYWt0b3JfZHppYWx1KQ0KY291bnQgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShtYXJjX2ZpZWxkXzYwMCRaQV9VV0FHSSkpDQptYXJjX2ZpZWxkXzYwMCA8LSBtZXJnZShtYXJjX2ZpZWxkXzYwMCxjb3VudCxieS54ID0gIlpBX1VXQUdJIiwgYnkueSA9ICJWYXIxIikgJT4lDQogIGZpbHRlcihGcmVxPDIpICU+JQ0KICBzZWxlY3QoLUZyZXEpICU+JQ0KICByZW5hbWUoRFpfRFpJQUxfSUQ9VFdfRFpfRFpJQUxfSUQpICU+JQ0KICBtdXRhdGUoUlpfUk9EWkFKX0lEID0gMiwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSBvIHR3w7NyY3kgKHByemVkbWlvdG93YSkiKQ0KDQojIyNwcnp5cGlzYW5pZSBkbyByZWRha3RvcsOzdyBuYSBwb2RzdGF3aWUgbGl0ZXJhdHVyeSB6IHBvbGEgNjU1DQpwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIikgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIG1hcmNfZmllbGRfNjAwJFpBX1VXQUdJKQ0KDQojNjU1DQptYXJjX2ZpZWxkXzY1NSA8LSBwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg2NTUpJT4lDQogIGZpbHRlcihYNjU1IT0iIikgJT4lDQogIG11dGF0ZShYNjU1PXN0cl9yZXBsYWNlX2FsbChYNjU1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg2NTUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDY1NSE9IiIpICU+JQ0KICBtdXRhdGUoWDY1NT1zdHJfcmVtb3ZlX2FsbChYNjU1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg2NTUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwocHJ6ZWRtaW90b3dhX3JlZGFrdG9yenkkWDY1NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzY1NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF82NTU8LWNiaW5kKG1hcmNfZmllbGRfNjU1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNjU1JFg2NTUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF82NTUkWDY1NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF82NTVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF82NTUkWDY1NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNjU1JFg2NTUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KbWFyY19maWVsZF82NTUgPC0gbWFyY19maWVsZF82NTUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgKSAlPiUNCiAgdW5pcXVlKCkNCg0KUEJMX2xpdGVyYXR1cnlfb2JjZSA8LSBQQkxfZHppYWx5X3BhdGggJT4lDQogIGZpbHRlcihOQURfRFpfRFpJQUxfSUQ9PTMwKSAlPiUNCiAgc2VsZWN0KDEsMikgJT4lDQogIGxlZnRfam9pbiguLHJlZGFrdG9yenlfZHppYWxvdyxieSA9ICJEWl9EWklBTF9JRCIpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHJlZGFrdG9yX2R6aWFsdSkpICU+JQ0KICBzZWxlY3QoMSxEWl9OQVpXQSA9IDIsNCkgJT4lDQogIG11dGF0ZShuYXp3YSA9IHN1YnN0cihzdHJfcmVwbGFjZShEWl9OQVpXQSwgIiguKj8pKCApKC4qPykiLCJcXDMiKSwxLG5jaGFyKHN0cl9yZXBsYWNlKERaX05BWldBLCAiKC4qPykoICkoLio/KSIsIlxcMyIpKS0xKSwNCiAgICAgICAgIG5hendhID0gaWZlbHNlKG5hendhPT0icm9tc2thIChjeWdhxYRza2EiLCJyb21za3xjeWdhxYRzayIsYXMuY2hhcmFjdGVyKG5hendhKSkpDQoNCnJlY3puZSA8LSBkYXRhLmZyYW1lKERaX0RaSUFMX0lEID0gYygzMiwzMiwzMiwzMiw1OSw4NiwxMDcsMTQ5LDY3LDY5LDM0LDM0LDM0LDM0LDM0LDU1LDMyLDk5LDM0KSxEWl9OQVpXQSA9IGMoIkxpdGVyYXR1cmEgYnJ5dHlqc2thIGkgaXJsYW5kemthIiwiTGl0ZXJhdHVyYSBicnl0eWpza2EgaSBpcmxhbmR6a2EiLCJMaXRlcmF0dXJhIGJyeXR5anNrYSBpIGlybGFuZHprYSIsIkxpdGVyYXR1cmEgYnJ5dHlqc2thIGkgaXJsYW5kemthIiwiTGl0ZXJhdHVyYSBncmVja2Egc3Rhcm/FvHl0bmEiLCJMaXRlcmF0dXJhIMWCYWNpxYRza2EgxZtyZWRuaW93aWVjem5hIiwiTGl0ZXJhdHVyYSBzeXJ5anNrYSIsIkxpdGVyYXR1cmEgZXNwZXJhbnRvIiwiTGl0ZXJhdHVyYSBob2xlbmRlcnNrYSIsIkxpdGVyYXR1cnkgSW5kaWkiLCJMaXRlcmF0dXJ5IEFmcnlraSBTdWJzYWhhcnlqc2tpZWoiLCJMaXRlcmF0dXJ5IEFmcnlraSBTdWJzYWhhcnlqc2tpZWoiLCJMaXRlcmF0dXJ5IEFmcnlraSBTdWJzYWhhcnlqc2tpZWoiLCJMaXRlcmF0dXJ5IEFmcnlraSBTdWJzYWhhcnlqc2tpZWoiLCJMaXRlcmF0dXJ5IEFmcnlraSBTdWJzYWhhcnlqc2tpZWoiLCAiTGl0ZXJhdHVyYSBlZ2lwc2tvLWFyYWJza2EiLCAiTGl0ZXJhdHVyYSBicnl0eWpza2EgaSBpcmxhbmR6a2EiLCJMaXRlcmF0dXJhIHBhbGVzdHnFhHNrby1hcmFic2thIiwiTGl0ZXJhdHVyeSBBZnJ5a2kgU3Vic2FoYXJ5anNraWVqIiksIHJlZGFrdG9yX2R6aWFsdSA9IGMoIkJFQVRBSyIsIkJFQVRBSyIsIkJFQVRBSyIsIkJFQVRBSyIsIkJFQVRBUyIsIkJFQVRBUyIsIkJFQVRBRCIsIkNlemFyeSIsIlRPTUFTWlUiLCJFV0EiLCJFV0EiLCJFV0EiLCJFV0EiLCJFV0EiLCJFV0EiLCJCRUFUQUQiLCJCRUFUQUsiLCJCRUFUQUQiLCJFV0EiKSwgbmF6d2EgPSBjKCJhbmdpZWxzayIsInN6a29jayIsImlybGFuZHprIiwid2FsaWpzayIsImdyZWNrIiwixYJhY2nFhHNrIiwic3lyeWpzayIsImVzcGVyYW5jayIsIm5pZGVybGFuZHprIiwiaW5keWpzayIsInBvxYJ1ZG5pb3dvYWZyeWthIiwic2VuZWdhbHNrIiwibmlnZXJ5anNrIiwiYWZyeWthxYRzayIsInJ1YW5keWpzayIsImVnaXBzay4gbm93b8W8eXRuIiwiY2VsdHljayIsInBhbGVzdHnFhHNrIiwic29tYWxpanNrIikpDQoNClBCTF9saXRlcmF0dXJ5X29iY2UgPC0gcmJpbmQoUEJMX2xpdGVyYXR1cnlfb2JjZSxyZWN6bmUpDQoNCm1hcmNfZmllbGRfNjU1IDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWFyY19maWVsZF82NTUgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBQQkxfbGl0ZXJhdHVyeV9vYmNlIGIgb24gYS5gJGFgIGxpa2UgKCclJ3x8Yi5uYXp3YXx8JyUnKSIpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLERaX0RaSUFMX0lEKQ0KDQptYXJjX2ZpZWxkXzY1NSRzYW1lIDwtIGN1bXN1bSghZHVwbGljYXRlZChtYXJjX2ZpZWxkXzY1NVsxXSkpDQptYXJjX2ZpZWxkXzY1NSA8LSBtYXJjX2ZpZWxkXzY1NVshZHVwbGljYXRlZChtYXJjX2ZpZWxkXzY1NSRzYW1lKSxdICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksRFpfRFpJQUxfSUQsRFpfTkFaV0EscmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpICU+JQ0KICBtdXRhdGUoVFdfVFdPUkNBX0lEID0gTkEsDQogICAgICAgICBUV19OQVpXSVNLTyA9IE5BLA0KICAgICAgICAgVFdfSU1JRSA9IE5BLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMjEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdyBoYcWbbGUgcnplY3pvd3ltIikgJT4lDQogIHNlbGVjdChuYW1lcyhtYXJjX2ZpZWxkXzYwMCkpDQojIyNwcnp5cGlzYW5pZSBkbyByZWRha3RvcsOzdyBuYSBwb2RzdGF3aWUgbGl0ZXJhdHVyeSB6IHBvbGEgNjUwDQpwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIikgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIG1hcmNfZmllbGRfNjAwJFpBX1VXQUdJKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgbWFyY19maWVsZF82NTUkWkFfVVdBR0kpDQoNCiM2NTANCm1hcmNfZmllbGRfNjUwIDwtIHByemVkbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDY1MCklPiUNCiAgZmlsdGVyKFg2NTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTA9c3RyX3JlcGxhY2VfYWxsKFg2NTAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDY1MCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjUwIT0iIikgJT4lDQogIG11dGF0ZShYNjUwPXN0cl9yZW1vdmVfYWxsKFg2NTAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDY1MCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSRYNjUwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjUwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzY1MDwtY2JpbmQobWFyY19maWVsZF82NTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF82NTAkWDY1MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzY1MCRYNjUwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzY1MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzY1MCRYNjUwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF82NTAkWDY1MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzY1MCA8LSBtYXJjX2ZpZWxkXzY1MCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWApICU+JQ0KICB1bmlxdWUoKQ0KDQptYXJjX2ZpZWxkXzY1MCA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG1hcmNfZmllbGRfNjUwIGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gUEJMX2xpdGVyYXR1cnlfb2JjZSBiIG9uIGEuYCRhYCBsaWtlICgnJSd8fGIubmF6d2F8fCclJykiKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSxEWl9EWklBTF9JRCkNCg0KbWFyY19maWVsZF82NTAkc2FtZSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTBbMV0pKQ0KbWFyY19maWVsZF82NTAgPC0gbWFyY19maWVsZF82NTBbIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTAkc2FtZSksXSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLERaX0RaSUFMX0lELERaX05BWldBLHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDIxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHcgaGHFm2xlIHJ6ZWN6b3d5bSIpICU+JQ0KICBzZWxlY3QobmFtZXMobWFyY19maWVsZF82MDApKQ0KDQpkb19wcnplZG1pb3Rvd2VqMSA8LSByYmluZChtYXJjX2ZpZWxkXzYwMCxtYXJjX2ZpZWxkXzY1NSxtYXJjX2ZpZWxkXzY1MCkNCg0KI3ByenlwaXNhbmllIG5hIHBvZHN0YXdpZSBkZXNrcnlwdG9yw7N3IHRlbWF0eWN6bnljaCB6IDY1MCBpIDY1NQ0KemFwaXN5IDwtIFJKREJDOjpkYkdldFF1ZXJ5KFBCTCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IHouemFfemFwaXNfaWQsIGR6LmR6X2R6aWFsX2lkLCBkei5kel9uYXp3YSwgcnoucnpfcm9kemFqX2lkLCByei5yel9uYXp3YSwgei56YV9zdGF0dXNfaW1wLCB6LnphX3V3YWdpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwYmxfemFwaXN5IHoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luIHBibF9kemlhbHkgZHogb24gZHouZHpfZHppYWxfaWQ9ei56YV9kel9kemlhbDFfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luIHBibF9yb2R6YWplX3phcGlzb3cgcnogb24gcnoucnpfcm9kemFqX2lkPXouemFfcnpfcm9kemFqMV9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHouemFfdXdhZ2kgbGlrZSAnJWltcG9ydCUnIikgJT4lDQogIG11dGF0ZShwcmFjb3duaWtfcGJsID0gc3RyX2V4dHJhY3QoWkFfVVdBR0ksICIoPzw9YWtjZXB0dWplOikoW0EtWl0qKSIpKSAlPiUNCiAgc2VsZWN0KC1aQV9VV0FHSSkNCm5hend5X2xpdF9vYmN5Y2ggPC0gc3RyX3JlcGxhY2VfYWxsKHBhc3RlKFBCTF9saXRlcmF0dXJ5X29iY2UkbmF6d2EsY29sbGFwc2UgPSAifCIpLCJcXCgiLCJcXFxcKCIpDQojYWt0dWFsaXphY2phIC0gZG9kYWogZG8gc2tyeXB0dSBsaXN0xJkgeiBvc3RhdG5pbSBicmFrdWrEhWN5bSB6YWltcG9ydG93YW55bSByb2N6bmlraWVtDQpwb3ByemVkbmllX2ltcG9ydHkgPC0gcmJpbmQobGlzdHlfMjAwNCxsaXN0eV8yMDA1LGxpc3R5XzIwMDYsbGlzdHlfMjAwNyxsaXN0eV8yMDA4LCBsaXN0eV8yMDA5LCBsaXN0eV8yMDEwKSAlPiUNCiAgZnVsbF9qb2luKC4semFwaXN5LGJ5ID0gIlpBX1pBUElTX0lEIikgJT4lDQogIHNlbGVjdChaQV9aQVBJU19JRCxYNjUwLFg2NTUsRFpfRFpJQUxfSUQsRFpfTkFaV0EsUlpfUk9EWkFKX0lELFJaX05BWldBLHByYWNvd25pa19wYmwsWkFfU1RBVFVTX0lNUCkgJT4lDQogIG11dGF0ZShYNjUwID0gc3RyX3JlbW92ZV9hbGwoWDY1MCwiXFxcXDciKSwNCiAgICAgICAgIFg2NTUgPSBzdHJfcmVtb3ZlX2FsbChYNjU1LCJcXFxcNyIpLA0KICAgICAgICAgWDY1MCA9IHN0cl9yZW1vdmVfYWxsKHN0cl9yZXBsYWNlX2FsbChYNjUwLCIoXFwkYSkiLCJcXFxcIzdcXDEiKSwiIyIpLA0KICAgICAgICAgWDY1NSA9IHN0cl9yZW1vdmVfYWxsKHN0cl9yZXBsYWNlX2FsbChYNjU1LCIoXFwkYSkiLCJcXFxcIzdcXDEiKSwiIyIpKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGZpbHRlcihSWl9ST0RaQUpfSUQgJW5vdGluJSBjKDAsMSwyLDI1MCw3NjQpKSAlPiUNCiAgYXJyYW5nZShwcmFjb3duaWtfcGJsLERaX0RaSUFMX0lEKSAlPiUNCiAgZmlsdGVyKCFncmVwbChuYXp3eV9saXRfb2JjeWNoLFg2NTApJiFncmVwbChuYXp3eV9saXRfb2JjeWNoLFg2NTUpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShwcmFjb3duaWtfcGJsKSkgJT4lDQogIGZpbHRlcihaQV9TVEFUVVNfSU1QICVpbiUgYygiSU9LIiwiSVBDIikpDQoNCiNwcnp5cGlzYW5pZSBuYSBwb2RzdGF3aWUgY3rEmXN0b3RsaXdvxZtjaSBkZXNrcnlwdG9yw7N3IDY1NQ0KcHJ6ZWRtaW90b3dhX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InByemVkbWlvdG93YSIpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb19wcnplZG1pb3Rvd2VqMSRaQV9VV0FHSSkNCg0KZGVza3J5cHRvcnk2NTUgPC0gcG9wcnplZG5pZV9pbXBvcnR5ICU+JQ0KICBzZWxlY3QoWDY1NSxwcmFjb3duaWtfcGJsLERaX0RaSUFMX0lELERaX05BWldBKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShYNjU1KSkgJT4lDQogIHVuaXRlKGRhdGE9Lixjb2wgPSAiZGVza3J5cHRvcjY1NSIsIHNlcCA9ICJ+IikNCg0KZGVza3J5cHRvcnk2NTUgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkZXNrcnlwdG9yeTY1NSRkZXNrcnlwdG9yNjU1KSkgJT4lDQogIGNTcGxpdCguLCJWYXIxIixzZXAgPSAifiIsZGlyZWN0aW9uID0gIndpZGUiKSAlPiUNCiAgcmVuYW1lKFg2NTUgPSBWYXIxXzEsDQogICAgICAgICByZWRha3Rvcl9kemlhbHUgPSBWYXIxXzIsDQogICAgICAgICBEWl9EWklBTF9JRCA9IFZhcjFfMywNCiAgICAgICAgIERaX05BWldBID0gVmFyMV80KSAlPiUNCiAgbXV0YXRlKFg2NTUgPSBzdHJfcmVtb3ZlX2FsbChYNjU1LCJcXFxcN1xcJGEiKSwNCiAgICAgICAgIFg2NTUgPSBzdHJfcmVtb3ZlX2FsbChYNjU1LCJcXCQyREJOIiksDQogICAgICAgICBYNjU1ID0gc3RyX3JlcGxhY2VfYWxsKFg2NTUsIlxcJC58XFx8IiwiICIpLA0KICAgICAgICAgWDY1NSA9IHN0cl9yZXBsYWNlX2FsbChYNjU1LCIgIiwiLioiKSwNCiAgICAgICAgIFg2NTUgPSBzdHJfcmVwbGFjZV9hbGwoWDY1NSwgIlteXFxwe0x9XFxkXFwqXFwuXFwtXFxzXSIsICIiKSkgJT4lDQogIGFycmFuZ2UoWDY1NSwtRnJlcSxEWl9OQVpXQSkNCg0KZGVza3J5cHRvcnk2NTUkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKGRlc2tyeXB0b3J5NjU1WzJdKSkNCmRlc2tyeXB0b3J5NjU1IDwtIGRlc2tyeXB0b3J5NjU1WyFkdXBsaWNhdGVkKGRlc2tyeXB0b3J5NjU1JGlkX2dydXB5KSxdICU+JQ0KICBzZWxlY3QoLWlkX2dydXB5KSAlPiUNCiAgYXJyYW5nZSgtRnJlcSkNCg0KeCA8LSAxOmxlbmd0aChkZXNrcnlwdG9yeTY1NSRYNjU1KQ0KdGVzdCA8LSBkYXRhLmZyYW1lKHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCg0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICAgIGRvX3ByemVkbWlvdG93ZWoyIDwtIHByemVkbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICAgICAgbXV0YXRlKHJlZGFrdG9yX2R6aWFsdSA9IGlmZWxzZShncmVwbChkZXNrcnlwdG9yeTY1NSRYNjU1W2ldLFg2NTUpLGFzLmNoYXJhY3RlcihkZXNrcnlwdG9yeTY1NSRyZWRha3Rvcl9kemlhbHUpW2ldLE5BKSwNCiAgICAgICAgICAgICBpbGUgPSBpZmVsc2UoZ3JlcGwoZGVza3J5cHRvcnk2NTUkWDY1NVtpXSxYNjU1KSxhcy5pbnRlZ2VyKGRlc2tyeXB0b3J5NjU1JEZyZXEpW2ldLE5BKSwNCiAgICAgICAgICAgICBjbyA9IGlmZWxzZShncmVwbChkZXNrcnlwdG9yeTY1NSRYNjU1W2ldLFg2NTUpLGFzLmNoYXJhY3RlcihkZXNrcnlwdG9yeTY1NSRYNjU1KVtpXSxOQSksDQogICAgICAgICAgICAgRFpfRFpJQUxfSUQgPSBpZmVsc2UoZ3JlcGwoZGVza3J5cHRvcnk2NTUkWDY1NVtpXSxYNjU1KSxhcy5pbnRlZ2VyKGRlc2tyeXB0b3J5NjU1JERaX0RaSUFMX0lEKVtpXSxOQSksDQogICAgICAgICAgICAgRFpfTkFaV0EgPSBpZmVsc2UoZ3JlcGwoZGVza3J5cHRvcnk2NTUkWDY1NVtpXSxYNjU1KSxhcy5jaGFyYWN0ZXIoZGVza3J5cHRvcnk2NTUkRFpfTkFaV0EpW2ldLE5BKSkgJT4lDQogICAgICBmaWx0ZXIoIWlzLm5hKHJlZGFrdG9yX2R6aWFsdSkpDQogICAgaWYgKGxlbmd0aChkb19wcnplZG1pb3Rvd2VqMiRyZWRha3Rvcl9kemlhbHUpPjApIHsNCiAgICAgIHRlc3QgPC0gcmJpbmQodGVzdCxkb19wcnplZG1pb3Rvd2VqMikNCiAgICB9IGVsc2Uge30NCiAgICANCn0NCmNvdW50IDwtIGFzLmRhdGEuZnJhbWUodGFibGUodGVzdCRaQV9VV0FHSSkpDQpkb19wcnplZG1pb3Rvd2VqMiA8LSBtZXJnZSh0ZXN0LGNvdW50LCBieS54ID0gIlpBX1VXQUdJIixieS55ID0gIlZhcjEiKSAlPiUNCiAgbXV0YXRlKGRsdWdvc2MgPSBuY2hhcihjbykpICU+JQ0KICBhcnJhbmdlKC1GcmVxLFpBX1VXQUdJLC1kbHVnb3NjLC1pbGUpDQoNCmRvX3ByemVkbWlvdG93ZWoyJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZChkb19wcnplZG1pb3Rvd2VqMlsxXSkpDQpkb19wcnplZG1pb3Rvd2VqMiA8LSBkb19wcnplZG1pb3Rvd2VqMlshZHVwbGljYXRlZChkb19wcnplZG1pb3Rvd2VqMiRpZF9ncnVweSksXSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDIxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHcgaGHFm2xlIHJ6ZWN6b3d5bSIpICU+JQ0KICBzZWxlY3QobmFtZXMoZG9fcHJ6ZWRtaW90b3dlajEpKQ0KI3ByenlwaXNhbmllIG5hIHBvZHN0YXdpZSBjesSZc3RvdGxpd2/Fm2NpIGRlc2tyeXB0b3LDs3cgNjUwDQpwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIikgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3ByemVkbWlvdG93ZWoxJFpBX1VXQUdJKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcHJ6ZWRtaW90b3dlajIkWkFfVVdBR0kpDQoNCmRlc2tyeXB0b3J5NjUwIDwtIHBvcHJ6ZWRuaWVfaW1wb3J0eSAlPiUNCiAgc2VsZWN0KFg2NTAscHJhY293bmlrX3BibCxEWl9EWklBTF9JRCxEWl9OQVpXQSkgJT4lDQogIGZpbHRlcighaXMubmEoWDY1MCkpICU+JQ0KICB1bml0ZShkYXRhPS4sY29sID0gImRlc2tyeXB0b3I2NTAiLCBzZXAgPSAifiIpDQoNCmRlc2tyeXB0b3J5NjUwIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZGVza3J5cHRvcnk2NTAkZGVza3J5cHRvcjY1MCkpICU+JQ0KICBjU3BsaXQoLiwiVmFyMSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJ3aWRlIikgJT4lDQogIHJlbmFtZShYNjUwID0gVmFyMV8xLA0KICAgICAgICAgcmVkYWt0b3JfZHppYWx1ID0gVmFyMV8yLA0KICAgICAgICAgRFpfRFpJQUxfSUQgPSBWYXIxXzMsDQogICAgICAgICBEWl9OQVpXQSA9IFZhcjFfNCkgJT4lDQogIG11dGF0ZShYNjUwID0gc3RyX3JlbW92ZV9hbGwoWDY1MCwiXFxcXDdcXCRhIiksDQogICAgICAgICBYNjUwID0gc3RyX3JlbW92ZV9hbGwoWDY1MCwiXFwkMkRCTiIpLA0KICAgICAgICAgWDY1MCA9IHN0cl9yZW1vdmVfYWxsKFg2NTAsIlxcXFxcXFxcIiksDQogICAgICAgICBYNjUwID0gc3RyX3JlcGxhY2VfYWxsKFg2NTAsIlxcJC58XFx8IiwiICIpLA0KICAgICAgICAgWDY1MCA9IHN0cl9yZXBsYWNlX2FsbChYNjUwLCIgIiwiLioiKSwNCiAgICAgICAgIFg2NTAgPSBzdHJfcmVwbGFjZV9hbGwoWDY1MCwgIlteXFxwe0x9XFxkXFwqXFwuXFwtXFxzXSIsICIiKSkgJT4lDQogIGFycmFuZ2UoWDY1MCwtRnJlcSxEWl9OQVpXQSkNCg0KZGVza3J5cHRvcnk2NTAkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKGRlc2tyeXB0b3J5NjUwWzJdKSkNCmRlc2tyeXB0b3J5NjUwIDwtIGRlc2tyeXB0b3J5NjUwWyFkdXBsaWNhdGVkKGRlc2tyeXB0b3J5NjUwJGlkX2dydXB5KSxdICU+JQ0KICBzZWxlY3QoLWlkX2dydXB5KSAlPiUNCiAgYXJyYW5nZSgtRnJlcSkNCg0KeCA8LSAxOmxlbmd0aChkZXNrcnlwdG9yeTY1MCRYNjUwKQ0KdGVzdCA8LSBkYXRhLmZyYW1lKHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgICBkb19wcnplZG1pb3Rvd2VqMyA8LSBwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSAlPiUNCiAgICAgIG11dGF0ZShyZWRha3Rvcl9kemlhbHUgPSBpZmVsc2UoZ3JlcGwoZGVza3J5cHRvcnk2NTAkWDY1MFtpXSxYNjUwKSxhcy5jaGFyYWN0ZXIoZGVza3J5cHRvcnk2NTAkcmVkYWt0b3JfZHppYWx1KVtpXSxOQSksDQogICAgICAgICAgICAgaWxlID0gaWZlbHNlKGdyZXBsKGRlc2tyeXB0b3J5NjUwJFg2NTBbaV0sWDY1MCksYXMuaW50ZWdlcihkZXNrcnlwdG9yeTY1MCRGcmVxKVtpXSxOQSksDQogICAgICAgICAgICAgY28gPSBpZmVsc2UoZ3JlcGwoZGVza3J5cHRvcnk2NTAkWDY1MFtpXSxYNjUwKSxhcy5jaGFyYWN0ZXIoZGVza3J5cHRvcnk2NTAkWDY1MClbaV0sTkEpLA0KICAgICAgICAgICAgIERaX0RaSUFMX0lEID0gaWZlbHNlKGdyZXBsKGRlc2tyeXB0b3J5NjUwJFg2NTBbaV0sWDY1MCksYXMuaW50ZWdlcihkZXNrcnlwdG9yeTY1MCREWl9EWklBTF9JRClbaV0sTkEpLA0KICAgICAgICAgICAgIERaX05BWldBID0gaWZlbHNlKGdyZXBsKGRlc2tyeXB0b3J5NjUwJFg2NTBbaV0sWDY1MCksYXMuY2hhcmFjdGVyKGRlc2tyeXB0b3J5NjUwJERaX05BWldBKVtpXSxOQSkpICU+JQ0KICAgICAgZmlsdGVyKCFpcy5uYShyZWRha3Rvcl9kemlhbHUpKQ0KICAgIGlmIChsZW5ndGgoZG9fcHJ6ZWRtaW90b3dlajMkcmVkYWt0b3JfZHppYWx1KT4wKSB7DQogICAgICB0ZXN0IDwtIHJiaW5kKHRlc3QsZG9fcHJ6ZWRtaW90b3dlajMpDQogICAgfSBlbHNlIHt9DQogICAgDQp9DQpjb3VudCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHRlc3QkWkFfVVdBR0kpKQ0KZG9fcHJ6ZWRtaW90b3dlajMgPC0gbWVyZ2UodGVzdCxjb3VudCwgYnkueCA9ICJaQV9VV0FHSSIsYnkueSA9ICJWYXIxIikgJT4lDQogIG11dGF0ZShkbHVnb3NjID0gbmNoYXIoY28pKSAlPiUNCiAgYXJyYW5nZSgtRnJlcSxaQV9VV0FHSSwtZGx1Z29zYywtaWxlKQ0KDQpkb19wcnplZG1pb3Rvd2VqMyRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoZG9fcHJ6ZWRtaW90b3dlajNbMV0pKQ0KZG9fcHJ6ZWRtaW90b3dlajMgPC0gZG9fcHJ6ZWRtaW90b3dlajNbIWR1cGxpY2F0ZWQoZG9fcHJ6ZWRtaW90b3dlajMkaWRfZ3J1cHkpLF0gJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAyMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB3IGhhxZtsZSByemVjem93eW0iKSAlPiUNCiAgc2VsZWN0KG5hbWVzKGRvX3ByemVkbWlvdG93ZWoxKSkNCg0KZG9fcHJ6ZWRtaW90b3dlaiA8LSByYmluZChkb19wcnplZG1pb3Rvd2VqMSxkb19wcnplZG1pb3Rvd2VqMixkb19wcnplZG1pb3Rvd2VqMykNCiNwcnp5cGlzYW5pZSBwcnplZG1pb3Rvd2VqIG5hIHBvZHN0YXdpZSBzxYJvd25pa2EgcG9qxJnEhw0KZG9fcHJ6ZWRtaW90b3dlaiA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIikgJT4lDQogIGxlZnRfam9pbiguLGRvX3ByemVkbWlvdG93ZWosYnk9IlpBX1VXQUdJIikgJT4lDQojcHJ6eXBpc2FuaWUgbmEgcG9kc3Rhd2llIHpkZWZpbmlvd2FueWNoIHPFgsOzdyAoZG9waXNhbmllIGRvIGdvdG93ZWdvIHBsaWt1KQ0KICBtdXRhdGUocmVkYWt0b3JfZHppYWx1ID0gaWZlbHNlKGlzLm5hKHJlZGFrdG9yX2R6aWFsdSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ0ZWF0ciIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJ0ZWF0ciIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJNQVJUQUsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoImZpbG0iLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgiZmlsbSIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJPTEEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgidGVsZXdpemoiLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgidGVsZXdpemoiLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKSwiRVdBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJyYWRpbyIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJyYWRpbyIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJFV0EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJjemFzb3Bpc20iLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgiY3phc29waXNtIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksIlRPTUFTWiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ3eWRhd25pY3R3IixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoInd5ZGF3bmljdHciLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKSwiQkFSQkFSQVciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIm9kIDE5ODkiLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgib2QgMTk4OSIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJQQVVMSU5BIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgixId3aWN6ZXx6YWRhbnxzemtvxYJ8c3prw7PFgnxzY2VuYXJpdXN6IHphasSZxId8c2NlbmFyaXVzemUgemFqxJnEh3x6YWrEmcSHfHBvbW9jbmljenxwb2RyxJljem5payIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCLEh3dpY3plfHphZGFufHN6a2/FgnxzemvDs8WCfHNjZW5hcml1c3ogemFqxJnEh3xzY2VuYXJpdXN6ZSB6YWrEmcSHfHphasSZxId8cG9tb2NuaWN6fHBvZHLEmWN6bmlrIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksIktBUk9MSU5BIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoInNjZW5pY3puIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoInNjZW5pY3puIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksIk1BUlRBSyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgidGVvcmlhfHNvY2pvbG9naWF8YW50cm9wb2xvZ2lhfG1ldGFmaXp5a3xpbnRlcnByZXRhY3xmaWxvem9mIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoInRlb3JpYXxzb2Nqb2xvZ2lhfGFudHJvcG9sb2dpYXxtZXRhZml6eWt8aW50ZXJwcmV0YWN8Zmlsb3pvZiIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJQQVVMSU5BIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgibHVkb3d8end5Y3p8b2J5Y3p8Zm9sa2wiLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgibHVkb3d8end5Y3p8b2J5Y3p8Zm9sa2wiLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKSwiQU5JQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJrYXRvbGljfGJpYmxpYXxiaWJsaWp8a2/Fm2Npw7PFgiIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJrYXRvbGljfGJpYmxpYXxiaWJsaWp8a2/Fm2Npw7PFgiIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJCRUFUQVMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoImRydWt8csSZa29waXxpbmt1bmFifGlud2VudHxiaWJsaW9ncnxzxYJvd25pa3xiaWJsaW90ZWsiLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgiZHJ1a3xyxJlrb3BpfGlua3VuYWJ8aW53ZW50fGJpYmxpb2dyfHPFgm93bmlrfGJpYmxpb3RlayIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJJWkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ6YWJhd2t8ZHppZWMiLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgiemFiYXdrfGR6aWVjIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksIkJBUkJBUkFXIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoInRlbWF0eWthfDIwLTIxIHcufDIxIHcuIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoInRlbWF0eWthfDIwLTIxIHcufDIxIHcuIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksIlBBVUxJTkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIjE5fDE4fDE3fDE2fDE1fDE0fDEzIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoIjE5fDE4fDE3fDE2fDE1fDE0fDEzIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksIkdPU0lBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgicG9saXR5ayIsWDY1NSxYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoInBvbGl0eWsiLFg2NTAsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpLCJQQVVMSU5BIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoImhpc3RvcmlhIixYNjU1LFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgiaGlzdG9yaWEiLFg2NTAsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpLCJHT1NJQSIsTkEpKSkpKSkpKSkpKSkpKSkpKSksYXMuY2hhcmFjdGVyKHJlZGFrdG9yX2R6aWFsdSkpLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gaWZlbHNlKGlzLm5hKFJaX1JPRFpBSl9JRCksMjEsYXMuaW50ZWdlcihSWl9ST0RaQUpfSUQpKSwNCiAgICAgICAgIFJaX05BWldBID0gaWZlbHNlKGlzLm5hKFJaX05BWldBKSwia3NpxIXFvGthIHcgaGHFm2xlIHJ6ZWN6b3d5bSIsYXMuY2hhcmFjdGVyKFJaX05BWldBKSkpICU+JQ0KICBzZWxlY3QobmFtZXMoZG9fcHJ6ZWRtaW90b3dlajEpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShyZWRha3Rvcl9kemlhbHUpKQ0KI3d5ZG9ieWNpZSB6YmlvcnUsIGt0w7NyeSBjacSFZ2xlIG5pZSBtYSBwcnp5cGlzYW55Y2ggcmVkYWt0b3LDs3cgZG8gcHJ6ZWRtaW90b3dlag0KcHJ6ZWRtaW90b3dhX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InByemVkbWlvdG93YSIpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb19wcnplZG1pb3Rvd2VqJFpBX1VXQUdJKQ0KI2RsYSBrc2nEhcW8ZWssIGt0w7NyZSBtYWrEhSBraWxrdSBhdXRvcsOzdyB3IG9zb2JhX2JuX3RlbWF0IC0gcHJ6eXBpc2FuaWUgZG8gcmVkYWt0b3JhIHBvd3N6ZWNobmVqIC0gQkVBVEFEPw0KZG9fcHJ6ZWRtaW90b3dlajQgPC0gcHJ6ZWRtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIGZpbHRlcighaXMubmEob3NvYmFfYm5fdGVtYXQpKSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSwNCiAgICAgICAgIERaX0RaSUFMX0lEID0gTkEsDQogICAgICAgICBEWl9OQVpXQSA9IE5BLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMjEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdyBoYcWbbGUgcnplY3pvd3ltIiwNCiAgICAgICAgIHJlZGFrdG9yX2R6aWFsdSA9ICJCRUFUQUQiKSAlPiUNCiAgc2VsZWN0KG5hbWVzKGRvX3ByemVkbWlvdG93ZWoxKSkNCiNkbGEga3NpxIXFvGVrLCBrdMOzcmUgbmllIG1hasSFIHd5cGXFgm5pb25lZ28gb3NvYmFfYm5fYXV0b3IgLSBwcnp5cGlzYW5pZSBkbyBNYXJ0eSB6IHg/IGN6eSBsb3Nvd28gZG8ga29nb8WbPw0KZG9fcHJ6ZWRtaW90b3dlajUgPC0gcHJ6ZWRtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIGZpbHRlcihpcy5uYShvc29iYV9ibl9hdXRvcikpICU+JQ0KICBtdXRhdGUoVFdfVFdPUkNBX0lEID0gTkEsDQogICAgICAgICBUV19OQVpXSVNLTyA9IE5BLA0KICAgICAgICAgVFdfSU1JRSA9IE5BLA0KICAgICAgICAgRFpfRFpJQUxfSUQgPSBOQSwNCiAgICAgICAgIERaX05BWldBID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAyMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB3IGhhxZtsZSByemVjem93eW0iLA0KICAgICAgICAgcmVkYWt0b3JfZHppYWx1ID0gIk1BUlRBS3giKSAlPiUNCiAgc2VsZWN0KG5hbWVzKGRvX3ByemVkbWlvdG93ZWoxKSkNCiNwb8WCYWN6ZW5pZSB3c3p5c3RraWNoIHByemVkbWlvdG93eWNoIHogcHJ6eXBpc2FueW1pIHJlZGFrdG9yYW1pIHcgamVkZW4gcGxpaw0KZG9fcHJ6ZWRtaW90b3dlaiA8LSByYmluZChkb19wcnplZG1pb3Rvd2VqLGRvX3ByemVkbWlvdG93ZWo0LGRvX3ByemVkbWlvdG93ZWo1KQ0KI2RsYSBrc2nEhcW8ZWssIGt0w7NyZSBtYWrEhSB3eXBlxYJuaW9uZSBvc29iYV9ibl9hdXRvciAtIHptaWFuYSBuYSBwb2RtaW90b3fEhSBkbyByxJljem5lZ28gcHJ6ZWpyemVuaWEgaSBwcnp5cGlzYW5pZSByZWRha3RvcsOzdw0KIyMjcHJ6eXBpc2FuaWUgZG8gcG9kbWlvdG93ZWohISEhISEhISEhISEhISEhISEhIyMjIyMjIyMjIyMjIyMjDQpkb19wb2RtaW90b3dlajEgPC0gcHJ6ZWRtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIGZpbHRlcighaXMubmEob3NvYmFfYm5fYXV0b3IpKQ0KI3RyemViYSB6YWt0dWFsaXpvd2HEhyB3IGJuX29rLCDFvGUgdGVyYXogdG8gc8SFIHBvZG1pb3Rvd2UNCiNsaXN0YSByZWtvcmTDs3cgZG8gcHJ6ZXBpc2FuaWEgeiBwcnplZG1pb3Rvd2VqIG5hIHBvZG1pb3Rvd8SFDQpsaXN0YV9kb19wcnplcGlzYW5pYSA8LSBkb19wb2RtaW90b3dlajEkWkFfVVdBR0kNCmJuX29rJHJvZHphal9rc2lhemtpW2JuX29rJFpBX1VXQUdJICVpbiUgbGlzdGFfZG9fcHJ6ZXBpc2FuaWFdIDwtICJwb2RtaW90b3dhIg0KI3RvLCBjbyBiecWCbyBwb2RtaW90b3fEhSBiZXogYXV0b3JhIHBvd2lubm8gdHJhZmnEhyBkbyBsaXRlcmF0dXJ5IGFub25pbW93ZWogeiBwcmFjb3duaWtpZW0gcHJ6ZWRtLCB3acSZYyB0ZXJheiB0cnplYmEgdG8gcHJ6ZXBpc2HEhyBkbyBwcnplZG1pb3Rvd2VqIC0gbmEga2/FhGN1IHByb2Nlc3UNCnBvZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icG9kbWlvdG93YSImWDEwMD09IiIpDQojcHJ6eXBpc2FuaWUgbGl0ZXJhdHVyeSBhbm9uaW1vd2VqDQojNjU1DQptYXJjX2ZpZWxkXzY1NSA8LSBwb2RtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNjU1KSU+JQ0KICBmaWx0ZXIoWDY1NSE9IiIpICU+JQ0KICBtdXRhdGUoWDY1NT1zdHJfcmVwbGFjZV9hbGwoWDY1NSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNjU1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg2NTUhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTU9c3RyX3JlbW92ZV9hbGwoWDY1NSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNjU1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSRYNjU1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjU1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzY1NTwtY2JpbmQobWFyY19maWVsZF82NTUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF82NTUkWDY1NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzY1NSRYNjU1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzY1NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzY1NSRYNjU1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF82NTUkWDY1NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzY1NSA8LSBtYXJjX2ZpZWxkXzY1NSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWApICU+JQ0KICB1bmlxdWUoKQ0KdHJpbSA8LSBmdW5jdGlvbiAoeCkgZ3N1YigiXlxccyt8XFxzKyQiLCAiIiwgeCkNClBCTF9saXRlcmF0dXJ5X2Fub25pbW93ZSA8LSBQQkxfZHppYWx5X3BhdGggJT4lDQogIGZpbHRlcihncmVwbCgiVXR3b3J5IGFub25pbSIsRFpfTkFaV0EpKSAlPiUNCiAgc2VsZWN0KERaX0RaSUFMX0lELERaX05BWldBLE5BRF9OQURfRFpfRFpJQUxfSUQpICU+JQ0KICBsZWZ0X2pvaW4oLixyZWRha3Rvcnp5X2R6aWFsb3csYnkgPSBjKCJOQURfTkFEX0RaX0RaSUFMX0lEIj0iRFpfRFpJQUxfSUQiKSkgJT4lDQogIHNlbGVjdCgxLERaX05BWldBID0gMiw1KSAlPiUNCiAgZmlsdGVyKERaX0RaSUFMX0lEICVub3RpbiUgYygxOTIyLDE5ODMpKSAlPiUNCiAgZ3JvdXBfYnkoRFpfRFpJQUxfSUQpICU+JQ0KICBtdXRhdGUobmF6d2EgPSBwYXN0ZSh0cmltKHVubGlzdChzdHJfZXh0cmFjdF9hbGwoRFpfTkFaV0EsIig/PD1cXCgpKC4qPykoPz1cXCh8XFwpKSIpKSksY29sbGFwc2UgPSAifCIpLA0KICAgICAgICAgbmF6d2EgPSBzdHJfcmVtb3ZlX2FsbChuYXp3YSwiKC4pKD89XFx8fCQpIiksDQogICAgICAgICBuYXp3YSA9IHN0cl9yZW1vdmUobmF6d2EsImxpdGVyYXR1ci4gIiksDQogICAgICAgICBuYXp3YSA9IGlmZWxzZShuYXp3YT09IiIsInBvbHNrIixhcy5jaGFyYWN0ZXIobmF6d2EpKSwNCiAgICAgICAgIHJlZGFrdG9yX2R6aWFsdSA9IGlmZWxzZShpcy5uYShyZWRha3Rvcl9kemlhbHUpLCJBTklBIixhcy5jaGFyYWN0ZXIocmVkYWt0b3JfZHppYWx1KSkpICU+JQ0KICB1bmdyb3VwKCkNCg0KcmVjem5lIDwtIGRhdGEuZnJhbWUoRFpfRFpJQUxfSUQgPSBjKDg5OSw2OTQsNjk0LDExNzQsMTQ1LDEyMjApLERaX05BWldBID0gYygiVXR3b3J5IGFub25pbW93ZSAoSW5kaWkpIiwiVXR3b3J5IGFub25pbW93ZSAoYnJ5dHlqc2thIGkgaXJsYW5kemthKSIsIlV0d29yeSBhbm9uaW1vd2UgKGJyeXR5anNrYSBpIGlybGFuZHprYSkiLCJVdHdvcnkgYW5vbmltb3dlIChzdGFyb3PFgm93aWHFhHNrYSkiLCJVdHdvcnkgYW5vbmltb3dlIGkgdWxvdG5lIiwiVXR3b3J5IGFub25pbW93ZSAodHVyZWNrYSkiKSwgcmVkYWt0b3JfZHppYWx1ID0gYygiRVdBIiwiQkVBVEFLIiwiQkVBVEFLIiwiQkVBVEFEIiwiQU5JQSIsIkVXQSIpLCBuYXp3YSA9IGMoImluZHlqc2siLCJ3YWxpanNrIiwiYW5naWVsc2siLCJzdGFyb3J1c2siLCJrYXN6dWJzayIsIm5vZ2Fqc2siKSkNCg0KUEJMX2xpdGVyYXR1cnlfYW5vbmltb3dlIDwtIHJiaW5kKFBCTF9saXRlcmF0dXJ5X2Fub25pbW93ZSxyZWN6bmUpDQoNCm1hcmNfZmllbGRfNjU1IDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWFyY19maWVsZF82NTUgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBQQkxfbGl0ZXJhdHVyeV9hbm9uaW1vd2UgYiBvbiBhLmAkYWAgbGlrZSAoJyUnfHxiLm5hendhfHwnJScpIikgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksRFpfRFpJQUxfSUQpDQoNCm1hcmNfZmllbGRfNjU1JHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjU1WzFdKSkNCm1hcmNfZmllbGRfNjU1IDwtIG1hcmNfZmllbGRfNjU1WyFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjU1JHNhbWUpLF0gJT4lDQogIHNlbGVjdChaQV9VV0FHSSxEWl9EWklBTF9JRCxEWl9OQVpXQSxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAyMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB3IGhhxZtsZSByemVjem93eW0iKSAlPiUNCiAgc2VsZWN0KG5hbWVzKG1hcmNfZmllbGRfNjAwKSkNCiMjI3ByenlwaXNhbmllIGRvIHJlZGFrdG9yw7N3IGxpdGVyYXR1cnkgYW5vbmltb3dlaiBuYSBwb2RzdGF3aWUgbGl0ZXJhdHVyeSB6IHBvbGEgNjUwDQpwb2RtaW90b3dhX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiJlgxMDA9PSIiKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgbWFyY19maWVsZF82NTUkWkFfVVdBR0kpDQoNCiM2NTANCm1hcmNfZmllbGRfNjUwIDwtIHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg2NTApJT4lDQogIGZpbHRlcihYNjUwIT0iIikgJT4lDQogIG11dGF0ZShYNjUwPXN0cl9yZXBsYWNlX2FsbChYNjUwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg2NTAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDY1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDY1MD1zdHJfcmVtb3ZlX2FsbChYNjUwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg2NTAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwocG9kbWlvdG93YV9yZWRha3Rvcnp5JFg2NTAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF82NTApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNjUwPC1jYmluZChtYXJjX2ZpZWxkXzY1MCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzY1MCRYNjUwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNjUwJFg2NTAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNjUwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNjUwJFg2NTApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzY1MCRYNjUwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCm1hcmNfZmllbGRfNjUwIDwtIG1hcmNfZmllbGRfNjUwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCkgJT4lDQogIHVuaXF1ZSgpDQoNCm1hcmNfZmllbGRfNjUwIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWFyY19maWVsZF82NTAgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBQQkxfbGl0ZXJhdHVyeV9hbm9uaW1vd2UgYiBvbiBhLmAkYWAgbGlrZSAoJyUnfHxiLm5hendhfHwnJScpIikgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksRFpfRFpJQUxfSUQpDQoNCm1hcmNfZmllbGRfNjUwJHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjUwWzFdKSkNCm1hcmNfZmllbGRfNjUwIDwtIG1hcmNfZmllbGRfNjUwWyFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjUwJHNhbWUpLF0gJT4lDQogIHNlbGVjdChaQV9VV0FHSSxEWl9EWklBTF9JRCxEWl9OQVpXQSxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAyMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB3IGhhxZtsZSByemVjem93eW0iKSAlPiUNCiAgc2VsZWN0KG5hbWVzKG1hcmNfZmllbGRfNjAwKSkNCmRvX3BvZG1pb3Rvd2VqMSA8LSByYmluZChtYXJjX2ZpZWxkXzY1NSxtYXJjX2ZpZWxkXzY1MCkNCg0KI2NvIHpyb2JpxIcgeiBwb3pvc3RhxYJ5bWkgcG9kbWlvdG93eW1pIGFub25pbW93eW1pLCBrdMOzcnljaCBuaWUgdWRhxYJvIHNpxJkgcHJ6eXBpc2HEhz8NCnBvZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icG9kbWlvdG93YSImWDEwMD09IiIpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb19wb2RtaW90b3dlajEkWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoVFdfVFdPUkNBX0lEID0gTkEsDQogICAgICAgICBUV19OQVpXSVNLTyA9IE5BLA0KICAgICAgICAgVFdfSU1JRSA9IE5BLA0KICAgICAgICAgRFpfRFpJQUxfSUQgPSBOQSwNCiAgICAgICAgIERaX05BWldBID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAyMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB3IGhhxZtsZSByemVjem93eW0iLA0KICAgICAgICAgcmVkYWt0b3JfZHppYWx1ID0gIktBUk9MSU5BIikgJT4lDQogIHNlbGVjdChuYW1lcyhkb19wcnplZG1pb3Rvd2VqMSkpDQpkb19wb2RtaW90b3dlajEgPC0gcmJpbmQoZG9fcG9kbWlvdG93ZWoxLHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSkNCg0KI2xpc3RhIHJla29yZMOzdyBkbyBwcnplcGlzYW5pYSB6IHBvZG1pb3Rvd2VqIG5hIHByemVkbWlvdG93xIUgKGNob2R6aSBvIGxpdGVyYXR1csSZIGFub25pbW93xIUpDQpsaXN0YV9kb19wcnplcGlzYW5pYSA8LSBkb19wb2RtaW90b3dlajEkWkFfVVdBR0kNCmJuX29rJHJvZHphal9rc2lhemtpW2JuX29rJFpBX1VXQUdJICVpbiUgbGlzdGFfZG9fcHJ6ZXBpc2FuaWFdIDwtICJwcnplZG1pb3Rvd2EiDQoNCiNwcnpldHdvcnplbmllIGNhxYJlaiBwb2RtaW90b3dlaiAoYm8gcGxpayBkb19wb2RtaW90b3dlajEganXFvCBqZXN0IHcgxZtyb2RrdSkNCiMjI3ByenlwaXNhbmllIHJlZGFrdG9yYSBuYSBwb2RzdGF3aWUgb3NvYnkgeiAxMDAgamFrbyB0d8OzcmN5IChhdXRvcmEpICh0YWJlbGEgcGJsLWJuLXZpYWYpLSBrc2nEhcW8a2kgdHfDs3JjeQ0KIzEwMA0KcG9kbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIikgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMSRaQV9VV0FHSSkNCg0KbWFyY19maWVsZF8xMDAgPC0gcG9kbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDEwMCklPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlcGxhY2VfYWxsKFgxMDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDEwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZW1vdmVfYWxsKFgxMDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChwb2RtaW90b3dhX3JlZGFrdG9yenkkWDEwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzEwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8xMDA8LWNiaW5kKG1hcmNfZmllbGRfMTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMTAwJFgxMDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8xMDAkWDEwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8xMDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8xMDAkWDEwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMTAwJFgxMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMTAwIDwtIG1hcmNfZmllbGRfMTAwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGRgLGAkY2ApICU+JQ0KICBtdXRhdGUobmFtZSA9IGlmZWxzZSghaXMubmEoYCRjYCkmc3Vic3RyKGAkY2AsbmNoYXIoYCRjYCksbmNoYXIoYCRjYCkpPT0iOyIscGFzdGUoYCRhYCxgJGNgLGAkZGAsc2VwID0gIiAiKSxpZmVsc2UoIWlzLm5hKGAkZGApLHBhc3RlKGAkYWAsYCRkYCxzZXAgPSAiICIpLGFzLmNoYXJhY3RlcihgJGFgKSkpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG5hbWUpICU+JQ0KICBtdXRhdGUobmFtZSA9IHN0cl9yZXBsYWNlKG5hbWUsIihcXCkpKFxcLiQpIiwiXFwxIiksDQogICAgICAgICBuYW1lID0gc3RyX3JlcGxhY2UobmFtZSwgIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pKFxcLiQpIiwiXFwxIikpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShuYW1lID0gcGFzdGUobmFtZSxjb2xsYXBzZSA9ICJ8IikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpDQoNCmRvX3BvZG1pb3Rvd2VqMiA8LSBtYXJjX2ZpZWxkXzEwMCAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGlubmVyX2pvaW4oLixwYmxfdmlhZixieSA9IGMoIm5hbWUiID0gIkJOX25hbWUiKSkgJT4lDQogIGlubmVyX2pvaW4oLixQQkxfdHdvcmN5LGJ5ID0gYygicGJsX2lkIj0iVFdfVFdPUkNBX0lEIikpICU+JQ0KICBsZWZ0X2pvaW4oLixyZWRha3Rvcnp5X2R6aWFsb3csYnkgPSBjKCJUV19EWl9EWklBTF9JRCI9IkRaX0RaSUFMX0lEIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksVFdfVFdPUkNBX0lEPXBibF9pZCxUV19OQVpXSVNLTyxUV19JTUlFLERaX0RaSUFMX0lEPVRXX0RaX0RaSUFMX0lELERaX05BWldBPURaX05BWldBLngscmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgbXV0YXRlKFJaX1JPRFpBSl9JRCA9IDEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdHfDs3JjeSAocG9kbWlvdG93YSkiKSAlPiUNCiAgdW5pcXVlKCkNCg0KIyMjcHJ6eXBpc2FuaWUgcmVkYWt0b3JhIG5hIHBvZHN0YXdpZSB6Ymllxbxub8WbY2kgZnJheiBuYXpld25pY3R3YSBvc29ieSB6IDEwMCB6IHR3w7NyY8SFIHBibCAoZGxhIHR5Y2gsIGt0w7NyZSBuaWUgem9zdGHFgnkgem1hcG93YW5lIG5hIGxpbmlpIHBibC1ibikgLSBrc2nEhcW8a2kgdHfDs3JjeQ0KcG9kbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIikgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMSRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMiRaQV9VV0FHSSkNCg0KIzEwMA0KbWFyY19maWVsZF8xMDAgPC0gcG9kbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDEwMCklPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlcGxhY2VfYWxsKFgxMDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDEwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZW1vdmVfYWxsKFgxMDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChwb2RtaW90b3dhX3JlZGFrdG9yenkkWDEwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzEwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8xMDA8LWNiaW5kKG1hcmNfZmllbGRfMTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMTAwJFgxMDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8xMDAkWDEwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8xMDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8xMDAkWDEwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMTAwJFgxMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KZG9fcG9kbWlvdG93ZWozIDwtIG1hcmNfZmllbGRfMTAwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiKD88PVthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiKSkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKGAkYWAgPSBwYXN0ZShgJGFgLGNvbGxhcHNlID0gInwiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShUV19OQVpXSVNLTyA9IGlmZWxzZShncmVwbCgiXFx8IixgJGFgKSwgc3RyX3JlcGxhY2VfYWxsKHN0cl9yZW1vdmVfYWxsKGAkYWAsIiwiKSwiXFx8IiwiLCAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiLCIsYCRhYCksc3RyX3JlcGxhY2VfYWxsKGAkYWAsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoYCRhYCkpKSwNCiAgICAgICAgIFRXX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIlxcfCIsYCRhYCksIioiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIiwiLGAkYWApLHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSksDQogICAgICAgICBuYXp3YSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIocGFzdGUoVFdfTkFaV0lTS08sVFdfSU1JRSxzZXAgPSAiIikpLCAiXFxXIiwgIiIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFRXX05BWldJU0tPLFRXX0lNSUUsbmF6d2EpICU+JSANCiAgaW5uZXJfam9pbiguLFBCTF90d29yY3lfcG9kbSAlPiUgc2VsZWN0KFRXX1RXT1JDQV9JRCxEWl9EWklBTF9JRD1UV19EWl9EWklBTF9JRCxEWl9OQVpXQSxuYXp3YSksYnk9Im5hendhIikNCmRvX3BvZG1pb3Rvd2VqMyRzYW1lIDwtIGN1bXN1bSghZHVwbGljYXRlZChkb19wb2RtaW90b3dlajNbMTo0XSkpDQpkb19wb2RtaW90b3dlajMgPC0gZG9fcG9kbWlvdG93ZWozICU+JSANCiAgYXJyYW5nZShaQV9VV0FHSSxUV19OQVpXSVNLTyxUV19JTUlFLG5hendhLFRXX1RXT1JDQV9JRCkNCmRvX3BvZG1pb3Rvd2VqMyA8LSBkb19wb2RtaW90b3dlajNbIWR1cGxpY2F0ZWQoZG9fcG9kbWlvdG93ZWozJHNhbWUpLF0gJT4lIA0KICBtdXRhdGUoRFpfRFpJQUxfSUQgPSBhcy5pbnRlZ2VyKERaX0RaSUFMX0lEKSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdHfDs3JjeSAocG9kbWlvdG93YSkiKSAlPiUgDQogIGlubmVyX2pvaW4oLixyZWRha3Rvcnp5X2R6aWFsb3cgJT4lIHNlbGVjdChEWl9EWklBTF9JRCxyZWRha3Rvcl9kemlhbHUpLGJ5PSJEWl9EWklBTF9JRCIpICU+JSANCiAgc2VsZWN0KG5hbWVzKGRvX3BvZG1pb3Rvd2VqMSkpDQoNCiMjI3ByenlwaXNhbmllIGF1dG9yw7N3IHBvZG1pb3Rvd2VqIGRvIGxpdGVyYXR1ciBpIHByenlwaXNhbmllIGRvIHJlZGFrdG9yw7N3IG5hIHBvZHN0YXdpZSBrb2R1IGxpdGVyYXR1cnkgeiBwb2xhIFgwODAgaSB0d29yemVuaWUgbm93eWNoIHR3w7NyY8OzdyBuYSBwb2RzdGF3aWUgcG9sYSAxMDANCnBvZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icG9kbWlvdG93YSIpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb19wb2RtaW90b3dlajEkWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb19wb2RtaW90b3dlajIkWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb19wb2RtaW90b3dlajMkWkFfVVdBR0kpDQoNCnBvZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbiBCTl9QQkxfbGlzdGFfbGl0ZXJhdHVyIGIgb24gYS5YMDgwIGxpa2UgKCclJ3x8Yi51a2Rfb2dvbG5lfHwnJScpIikNCg0KIyMjZG9kYXdhbmllIG5hemV3bmljdHcgbm93eWNoIHR3w7NyY8Ozdw0KIzEwMA0KbWFyY19maWVsZF8xMDAgPC0gcG9kbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDEwMCklPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlcGxhY2VfYWxsKFgxMDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDEwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZW1vdmVfYWxsKFgxMDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChwb2RtaW90b3dhX3JlZGFrdG9yenkkWDEwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzEwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8xMDA8LWNiaW5kKG1hcmNfZmllbGRfMTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMTAwJFgxMDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8xMDAkWDEwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8xMDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8xMDAkWDEwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMTAwJFgxMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KbWFyY19maWVsZF8xMDAgPC0gbWFyY19maWVsZF8xMDAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHBhc3RlKGAkYWAsY29sbGFwc2UgPSAifCIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKFRXX05BWldJU0tPID0gaWZlbHNlKGdyZXBsKCJcXHwiLGAkYWApLCBzdHJfcmVwbGFjZV9hbGwoc3RyX3JlbW92ZV9hbGwoYCRhYCwiLCIpLCJcXHwiLCIsICIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIsIixgJGFgKSxzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKC4qPykoLCApKC4qKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihgJGFgKSkpLA0KICAgICAgICAgVFdfSU1JRSA9IGlmZWxzZShncmVwbCgiXFx8IixgJGFgKSwiKiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiLCIsYCRhYCksc3RyX3JlcGxhY2VfYWxsKGAkYWAsIiguKj8pKCwgKSguKikiLCJcXDMiKSwiKiIpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxUV19OQVpXSVNLTyxUV19JTUlFKQ0KI2pvaW4gbmEgcG9kc3Rhd2llIGlkZW50eWN6bmVnbyBpZA0KcG9kbWlvdG93YV9yZWRha3Rvcnp5IDwtIHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8xMDAsYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShwYmxfbmF6d2EgPSBhcy5jaGFyYWN0ZXIocGJsX25hendhKSkgJT4lDQogIG11dGF0ZShEWl9EWklBTF9JRCA9IGlmZWxzZShuYXp3YV9wcm9zdGE9PSJwb2xzayImc3Vic3RyKHBibF9uYXp3YSxuY2hhcihwYmxfbmF6d2EpLG5jaGFyKHBibF9uYXp3YSkpIT1zdWJzdHIoVFdfTkFaV0lTS08sMSwxKSxOQSxhcy5pbnRlZ2VyKHBibF9pZCkpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLERaX0RaSUFMX0lEKQ0KDQpjb3VudCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSRaQV9VV0FHSSkpDQpwb2RtaW90b3dhX3JlZGFrdG9yenkgPC0gbWVyZ2UocG9kbWlvdG93YV9yZWRha3Rvcnp5LGNvdW50LGJ5LnggPSAiWkFfVVdBR0kiLGJ5LnkgPSAiVmFyMSIpICU+JQ0KICBtdXRhdGUoZGx1Z29zYyA9IG5jaGFyKHVrZF9vZ29sbmUpKSAlPiUNCiAgYXJyYW5nZSgtRnJlcSxaQV9VV0FHSSwtZGx1Z29zYyxwYmxfaWQpDQpwb2RtaW90b3dhX3JlZGFrdG9yenkkc2FtZSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQocG9kbWlvdG93YV9yZWRha3Rvcnp5WzFdKSkNCmRvX3BvZG1pb3Rvd2VqNCA8LSBwb2RtaW90b3dhX3JlZGFrdG9yenlbIWR1cGxpY2F0ZWQocG9kbWlvdG93YV9yZWRha3Rvcnp5JHNhbWUpLF0gJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSkgJT4lDQogIHJlbmFtZShEWl9OQVpXQSA9IHBibF9uYXp3YSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxUV19UV09SQ0FfSUQsVFdfTkFaV0lTS08sVFdfSU1JRSxEWl9EWklBTF9JRCxEWl9OQVpXQSxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBtdXRhdGUoUlpfUk9EWkFKX0lEID0gMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB0d8OzcmN5IChwb2RtaW90b3dhKSIpDQoNCiMjI3ByenlwaXNhbmllIGF1dG9yw7N3IHBvZG1pb3Rvd2VqIGRvIGxpdGVyYXR1ciBpIHByenlwaXNhbmllIGRvIHJlZGFrdG9yw7N3IG5hIHBvZHN0YXdpZSBsaXRlcmF0dXJ5IHogcG9sYSA2NTUgaSB0d29yemVuaWUgbm93eWNoIHR3w7NyY8OzdyBuYSBwb2RzdGF3aWUgcG9sYSAxMDANCnBvZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icG9kbWlvdG93YSIpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb19wb2RtaW90b3dlajEkWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb19wb2RtaW90b3dlajIkWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb19wb2RtaW90b3dlajMkWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb19wb2RtaW90b3dlajQkWkFfVVdBR0kpDQoNCiM2NTUNCm1hcmNfZmllbGRfNjU1IDwtIHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg2NTUpJT4lDQogIGZpbHRlcihYNjU1IT0iIikgJT4lDQogIG11dGF0ZShYNjU1PXN0cl9yZXBsYWNlX2FsbChYNjU1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg2NTUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDY1NSE9IiIpICU+JQ0KICBtdXRhdGUoWDY1NT1zdHJfcmVtb3ZlX2FsbChYNjU1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg2NTUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwocG9kbWlvdG93YV9yZWRha3Rvcnp5JFg2NTUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF82NTUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNjU1PC1jYmluZChtYXJjX2ZpZWxkXzY1NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzY1NSRYNjU1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNjU1JFg2NTUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNjU1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNjU1JFg2NTUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzY1NSRYNjU1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCm1hcmNfZmllbGRfNjU1IDwtIG1hcmNfZmllbGRfNjU1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCkgJT4lDQogIHVuaXF1ZSgpDQoNCm1hcmNfZmllbGRfNjU1IDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWFyY19maWVsZF82NTUgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBQQkxfaGFzbGFfb3NvYm93ZSBiIG9uIGEuYCRhYCBsaWtlICgnJSd8fGIubmF6d2F8fCclJykiKQ0KDQojIyNkb2Rhd2FuaWUgbmF6ZXduaWN0dyBub3d5Y2ggdHfDs3Jjw7N3DQojMTAwDQptYXJjX2ZpZWxkXzEwMCA8LSBwb2RtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMTAwKSU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMTAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlbW92ZV9hbGwoWDEwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSRYMTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzEwMDwtY2JpbmQobWFyY19maWVsZF8xMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8xMDAkWDEwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzEwMCRYMTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzEwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzEwMCRYMTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8xMDAkWDEwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzEwMCA8LSBtYXJjX2ZpZWxkXzEwMCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWApICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIig/PD1bYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pKFxcLiQpIikpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoYCRhYCxjb2xsYXBzZSA9ICJ8IikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUoVFdfTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIlxcfCIsYCRhYCksIHN0cl9yZXBsYWNlX2FsbChzdHJfcmVtb3ZlX2FsbChgJGFgLCIsIiksIlxcfCIsIiwgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIiwiLGAkYWApLHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoLio/KSgsICkoLiopIiwiXFwxIiksYXMuY2hhcmFjdGVyKGAkYWApKSksDQogICAgICAgICBUV19JTUlFID0gaWZlbHNlKGdyZXBsKCJcXHwiLGAkYWApLCIqIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIsIixgJGFgKSxzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKC4qPykoLCApKC4qKSIsIlxcMyIpLCIqIikpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFRXX05BWldJU0tPLFRXX0lNSUUpDQojam9pbiBuYSBwb2RzdGF3aWUgaWRlbnR5Y3puZWdvIGlkDQptYXJjX2ZpZWxkXzY1NSA8LSBtYXJjX2ZpZWxkXzY1NSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8xMDAsYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShEWl9EWklBTF9JRCA9IGlmZWxzZShuYXp3YT09InBvbHNrIiZzdWJzdHIoRFpfTkFaV0EsbmNoYXIoRFpfTkFaV0EpLG5jaGFyKERaX05BWldBKSkhPXN1YnN0cihUV19OQVpXSVNLTywxLDEpLE5BLGFzLmludGVnZXIoRFpfRFpJQUxfSUQpKSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSxEWl9EWklBTF9JRCkNCiAgICANCm1hcmNfZmllbGRfNjU1JHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjU1WzFdKSkNCmRvX3BvZG1pb3Rvd2VqNSA8LSBtYXJjX2ZpZWxkXzY1NVshZHVwbGljYXRlZChtYXJjX2ZpZWxkXzY1NSRzYW1lKSxdICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksRFpfRFpJQUxfSUQsRFpfTkFaV0EsVFdfTkFaV0lTS08sVFdfSU1JRSxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdHfDs3JjeSAocG9kbWlvdG93YSkiKSAlPiUNCiAgc2VsZWN0KG5hbWVzKG1hcmNfZmllbGRfNjAwKSkNCg0KIyMjcHJ6eXBpc2FuaWUgYXV0b3LDs3cgcG9kbWlvdG93ZWogZG8gbGl0ZXJhdHVyIGkgcHJ6eXBpc2FuaWUgZG8gcmVkYWt0b3LDs3cgbmEgcG9kc3Rhd2llIGxpdGVyYXR1cnkgeiBwb2xhIDY1NSBpIHR3b3J6ZW5pZSBub3d5Y2ggdHfDs3Jjw7N3IG5hIHBvZHN0YXdpZSBwb2xhIDEwMA0KcG9kbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIikgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMSRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMiRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMyRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqNCRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqNSRaQV9VV0FHSSkNCg0KIzY1MA0KbWFyY19maWVsZF82NTAgPC0gcG9kbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDY1MCklPiUNCiAgZmlsdGVyKFg2NTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTA9c3RyX3JlcGxhY2VfYWxsKFg2NTAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDY1MCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjUwIT0iIikgJT4lDQogIG11dGF0ZShYNjUwPXN0cl9yZW1vdmVfYWxsKFg2NTAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDY1MCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChwb2RtaW90b3dhX3JlZGFrdG9yenkkWDY1MCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzY1MClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF82NTA8LWNiaW5kKG1hcmNfZmllbGRfNjUwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNjUwJFg2NTAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF82NTAkWDY1MCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF82NTBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF82NTAkWDY1MCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNjUwJFg2NTApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KbWFyY19maWVsZF82NTAgPC0gbWFyY19maWVsZF82NTAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgKSAlPiUNCiAgdW5pcXVlKCkNCg0KbWFyY19maWVsZF82NTAgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtYXJjX2ZpZWxkXzY1MCBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIFBCTF9oYXNsYV9vc29ib3dlIGIgb24gYS5gJGFgIGxpa2UgKCclJ3x8Yi5uYXp3YXx8JyUnKSIpICAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8xMDAsYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShEWl9EWklBTF9JRCA9IGlmZWxzZShuYXp3YT09InBvbHNrIiZzdWJzdHIoRFpfTkFaV0EsbmNoYXIoRFpfTkFaV0EpLG5jaGFyKERaX05BWldBKSkhPXN1YnN0cihUV19OQVpXSVNLTywxLDEpLE5BLGFzLmludGVnZXIoRFpfRFpJQUxfSUQpKSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSxEWl9EWklBTF9JRCkNCg0KbWFyY19maWVsZF82NTAkc2FtZSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTBbMV0pKQ0KZG9fcG9kbWlvdG93ZWo2IDwtIG1hcmNfZmllbGRfNjUwWyFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjUwJHNhbWUpLF0gJT4lDQogIHNlbGVjdChaQV9VV0FHSSxEWl9EWklBTF9JRCxEWl9OQVpXQSxUV19OQVpXSVNLTyxUV19JTUlFLHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB0d8OzcmN5IChwb2RtaW90b3dhKSIpICU+JQ0KICBzZWxlY3QobmFtZXMobWFyY19maWVsZF82MDApKQ0KI2NvIHpvc3RhxYJvIGRvIHBvZG1pb3Rvd2VqPw0KcG9kbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIikgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMSRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMiRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMyRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqNCRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqNSRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqNiRaQV9VV0FHSSkNCiNuYWRkYXRlayBwcnp5cGlzYcSHIE1hcmNpZSBqYWtvIHBvZG1pb3Rvd8SFIGJleiB0d8OzcmPDs3cgaSBjenlfYXV0b21hdHljem5pZSA8LSBuaWUNCmRvX3BvZG1pb3Rvd2VqNyA8LSBwb2RtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBEWl9EWklBTF9JRCA9IE5BLA0KICAgICAgICAgRFpfTkFaV0EgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdHfDs3JjeSAocG9kbWlvdG93YSkiLA0KICAgICAgICAgcmVkYWt0b3JfZHppYWx1ID0gIk1BUlRBS3giKSAlPiUNCiAgc2VsZWN0KG5hbWVzKGRvX3BvZG1pb3Rvd2VqNSkpDQojdHJ6ZWJhIHpha3R1YWxpem93YcSHIHcgYm5fb2ssIMW8ZSB0ZXJheiB0byBuaWUgc8SFIGF1dG9tYXR5Y3puZQ0KbGlzdGFfZG9fcHJ6ZXBpc2FuaWEgPC0gZG9fcG9kbWlvdG93ZWo3JFpBX1VXQUdJDQpibl9vayRjenlfYXV0b21hdHljem5pZVtibl9vayRaQV9VV0FHSSAlaW4lIGxpc3RhX2RvX3ByemVwaXNhbmlhXSA8LSAibmllIg0KI3BvxYLEhWN6ZW5pZSBwcnp5ZHppYcWCdSBwb2RtaW90b3d5Y2ggdyBqZWRlbiBwbGlrDQpkb19wb2RtaW90b3dlaiA8LSByYmluZChkb19wb2RtaW90b3dlajEsZG9fcG9kbWlvdG93ZWoyLGRvX3BvZG1pb3Rvd2VqMyxkb19wb2RtaW90b3dlajQsZG9fcG9kbWlvdG93ZWo1LGRvX3BvZG1pb3Rvd2VqNixkb19wb2RtaW90b3dlajcpDQoNCiNwcnp5cGlzYW5pZSBhbnRvbG9naWkgZG8gVG9ta2EgaSBkbyBsaXRlcmF0dXIgbmEgcG9kc3Rhd2llIDA4MA0KYW50b2xvZ2llX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraSA9PSAiYW50b2xvZ2lhIikNClBCTF9kemlhbHlfYW50b2xvZ2llIDwtIFBCTF9kemlhbHlfcGF0aCAlPiUNCiAgZmlsdGVyKGdyZXBsKCJhbnRvbG9nIixEWl9OQVpXQSxpZ25vcmUuY2FzZSA9IFRSVUUpKSAlPiUNCiAgbGVmdF9qb2luKC4scmVkYWt0b3J6eV9kemlhbG93LGJ5PSJEWl9EWklBTF9JRCIpICU+JQ0KICBzZWxlY3QoRFpfRFpJQUxfSUQsRFpfTkFaV0E9RFpfTkFaV0EueCxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBtdXRhdGUocmVkYWt0b3JfZHppYWx1ID0gaWZlbHNlKGlzLm5hKHJlZGFrdG9yX2R6aWFsdSksIlRPTUFTWiIsYXMuY2hhcmFjdGVyKHJlZGFrdG9yX2R6aWFsdSkpKQ0KDQpQQkxfZHppYWx5X2FudG9sb2dpZSA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIFBCTF9kemlhbHlfYW50b2xvZ2llIGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gKHNlbGVjdCBjLnVrZF9vZ29sbmUsYy5uYXp3YV9wcm9zdGEsYy5wYmxfaWQsYy5wYmxfbmF6d2EsYy5wYmxfaWRfbGl0ZXJhdHVyeSxjLnBibF9saXRlcmF0dXJhIGZyb20gQk5fUEJMX2xpc3RhX2xpdGVyYXR1ciBjKSBiIG9uIGEuRFpfTkFaV0EgbGlrZSAoJyUnfHxiLm5hendhX3Byb3N0YXx8JyUnKSIpICU+JQ0KICBtdXRhdGUodWtkX29nb2xuZSA9IGlmZWxzZShEWl9EWklBTF9JRD09MTQ2LCI4MjEuMTYyLjEiLGFzLmNoYXJhY3Rlcih1a2Rfb2dvbG5lKSksDQogICAgICAgICBuYXp3YV9wcm9zdGEgPSBpZmVsc2UoRFpfRFpJQUxfSUQ9PTE0NiwicG9sc2siLGFzLmNoYXJhY3RlcihuYXp3YV9wcm9zdGEpKSkgJT4lDQogIGZpbHRlcighaXMubmEodWtkX29nb2xuZSkpICU+JQ0KICBmaWx0ZXIoRFpfRFpJQUxfSUQhPTc0NCkgJT4lDQogIHNlbGVjdCgxOjUpIA0KDQphbnRvbG9naWVfcmVkYWt0b3J6eSA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGFudG9sb2dpZV9yZWRha3Rvcnp5IGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luIFBCTF9kemlhbHlfYW50b2xvZ2llIGIgb24gYS5YMDgwIGxpa2UgKCclJ3x8Yi51a2Rfb2dvbG5lfHwnJScpIikNCg0KY291bnQgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShhbnRvbG9naWVfcmVkYWt0b3J6eSRaQV9VV0FHSSkpDQphbnRvbG9naWVfcmVkYWt0b3J6eSA8LSBtZXJnZShhbnRvbG9naWVfcmVkYWt0b3J6eSxjb3VudCxieS54ID0gIlpBX1VXQUdJIixieS55ID0gIlZhcjEiKSAlPiUNCiAgbXV0YXRlKGRsdWdvc2MgPSBuY2hhcih1a2Rfb2dvbG5lKSkgJT4lDQogIGFycmFuZ2UoLUZyZXEsWkFfVVdBR0ksLWRsdWdvc2MsRFpfRFpJQUxfSUQpDQphbnRvbG9naWVfcmVkYWt0b3J6eSRzYW1lIDwtIGN1bXN1bSghZHVwbGljYXRlZChhbnRvbG9naWVfcmVkYWt0b3J6eVsxXSkpDQpkb19hbnRvbG9naWkxIDwtIGFudG9sb2dpZV9yZWRha3Rvcnp5WyFkdXBsaWNhdGVkKGFudG9sb2dpZV9yZWRha3Rvcnp5JHNhbWUpLF0gJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksVFdfVFdPUkNBX0lELFRXX05BWldJU0tPLFRXX0lNSUUsRFpfRFpJQUxfSUQsRFpfTkFaV0EscmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgbXV0YXRlKFJaX1JPRFpBSl9JRCA9IDIxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHcgaGHFm2xlIHJ6ZWN6b3d5bSIpDQojcHJ6eXBpc2FuaWUgYW50b2xvZ2lpIGRvIFRvbWthIGkgZG8gbGl0ZXJhdHVyIG5hIHBvZHN0YXdpZSA2NjUNCmFudG9sb2dpZV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2kgPT0gImFudG9sb2dpYSIpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb19hbnRvbG9naWkxJFpBX1VXQUdJKQ0KDQptYXJjX2ZpZWxkXzY1NSA8LSBhbnRvbG9naWVfcmVkYWt0b3J6eSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg2NTUpJT4lDQogIGZpbHRlcihYNjU1IT0iIikgJT4lDQogIG11dGF0ZShYNjU1PXN0cl9yZXBsYWNlX2FsbChYNjU1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg2NTUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDY1NSE9IiIpICU+JQ0KICBtdXRhdGUoWDY1NT1zdHJfcmVtb3ZlX2FsbChYNjU1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg2NTUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoYW50b2xvZ2llX3JlZGFrdG9yenkkWDY1NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzY1NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF82NTU8LWNiaW5kKG1hcmNfZmllbGRfNjU1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNjU1JFg2NTUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF82NTUkWDY1NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF82NTVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF82NTUkWDY1NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNjU1JFg2NTUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KbWFyY19maWVsZF82NTUgPC0gbWFyY19maWVsZF82NTUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgKSAlPiUNCiAgdW5pcXVlKCkNCg0KbWFyY19maWVsZF82NTUgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtYXJjX2ZpZWxkXzY1NSBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIFBCTF9kemlhbHlfYW50b2xvZ2llIGIgb24gYS5gJGFgIGxpa2UgKCclJ3x8Yi5uYXp3YV9wcm9zdGF8fCclJykiKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLERaX0RaSUFMX0lEKQ0KDQptYXJjX2ZpZWxkXzY1NSRzYW1lIDwtIGN1bXN1bSghZHVwbGljYXRlZChtYXJjX2ZpZWxkXzY1NVsxXSkpDQpkb19hbnRvbG9naWkyIDwtIG1hcmNfZmllbGRfNjU1WyFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjU1JHNhbWUpLF0gJT4lDQogIHNlbGVjdChaQV9VV0FHSSxEWl9EWklBTF9JRCxEWl9OQVpXQSxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAyMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB3IGhhxZtsZSByemVjem93eW0iKSAlPiUNCiAgc2VsZWN0KG5hbWVzKGRvX2FudG9sb2dpaTEpKQ0KI3ByenlwaXNhbmllIGFudG9sb2dpaSBkbyBUb21rYSBpIGRvIGxpdGVyYXR1ciBuYSBwb2RzdGF3aWUgNjY1DQphbnRvbG9naWVfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpID09ICJhbnRvbG9naWEiKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fYW50b2xvZ2lpMSRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX2FudG9sb2dpaTIkWkFfVVdBR0kpDQoNCm1hcmNfZmllbGRfNjUwIDwtIGFudG9sb2dpZV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDY1MCklPiUNCiAgZmlsdGVyKFg2NTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTA9c3RyX3JlcGxhY2VfYWxsKFg2NTAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDY1MCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjUwIT0iIikgJT4lDQogIG11dGF0ZShYNjUwPXN0cl9yZW1vdmVfYWxsKFg2NTAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDY1MCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChhbnRvbG9naWVfcmVkYWt0b3J6eSRYNjUwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjUwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzY1MDwtY2JpbmQobWFyY19maWVsZF82NTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF82NTAkWDY1MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzY1MCRYNjUwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzY1MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzY1MCRYNjUwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF82NTAkWDY1MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzY1MCA8LSBtYXJjX2ZpZWxkXzY1MCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWApICU+JQ0KICB1bmlxdWUoKQ0KDQptYXJjX2ZpZWxkXzY1MCA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG1hcmNfZmllbGRfNjUwIGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gUEJMX2R6aWFseV9hbnRvbG9naWUgYiBvbiBhLmAkYWAgbGlrZSAoJyUnfHxiLm5hendhX3Byb3N0YXx8JyUnKSIpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksRFpfRFpJQUxfSUQpDQoNCm1hcmNfZmllbGRfNjUwJHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjUwWzFdKSkNCmRvX2FudG9sb2dpaTMgPC0gbWFyY19maWVsZF82NTBbIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTAkc2FtZSksXSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLERaX0RaSUFMX0lELERaX05BWldBLHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDIxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHcgaGHFm2xlIHJ6ZWN6b3d5bSIpICU+JQ0KICBzZWxlY3QobmFtZXMoZG9fYW50b2xvZ2lpMSkpDQojcmVzenRhIGFudG9sb2dpaSBiZXogZHppYcWCdSBwbyBwcm9zdHUgcHJ6eXBpc2FuYSBkbyBUb21rYQ0KYW50b2xvZ2llX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraSA9PSAiYW50b2xvZ2lhIikgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX2FudG9sb2dpaTEkWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb19hbnRvbG9naWkyJFpBX1VXQUdJKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fYW50b2xvZ2lpMyRaQV9VV0FHSSkNCg0KZG9fYW50b2xvZ2lpNCA8LSBhbnRvbG9naWVfcmVkYWt0b3J6eSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSwNCiAgICAgICAgIERaX0RaSUFMX0lEID0gTkEsDQogICAgICAgICBEWl9OQVpXQSA9IE5BLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMjEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdyBoYcWbbGUgcnplY3pvd3ltIiwNCiAgICAgICAgIHJlZGFrdG9yX2R6aWFsdSA9ICJUT01BU1oiKSAlPiUNCiAgc2VsZWN0KG5hbWVzKGRvX2FudG9sb2dpaTEpKQ0KDQpkb19hbnRvbG9naWkgPC0gcmJpbmQoZG9fYW50b2xvZ2lpMSxkb19hbnRvbG9naWkyLGRvX2FudG9sb2dpaTMsZG9fYW50b2xvZ2lpNCkNCiMjI3ByenlwaXNhbmllIHJlZGFrdG9yYSBkbyB3c3DDs8WCd3lkYcWEIG5hIHBvZHN0YXdpZSBvc29ieSB6IDI0NSBqYWtvIHR3w7NyY3kgKGF1dG9yYSkgKHRhYmVsYSBwYmwtYm4tdmlhZiktIGtzacSFxbxraSB0d8OzcmN5DQp3c3BvbHd5ZGFuaWVfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0id3Nww7PFgnd5ZGFuaWUiKQ0KDQpkb193c3BvbHd5ZGFuaWExIDwtIHdzcG9sd3lkYW5pZV9yZWRha3Rvcnp5ICU+JSANCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpICU+JSANCiAgbXV0YXRlKFgyNDUgPSBzdHJfZXh0cmFjdChYMjQ1LCAiKD88PVxcL1xcJGMpKC4qPykoPz0gO3wkKSIpLA0KICAgICAgICAgWDI0NSA9IHN0cl9yZW1vdmUoWDI0NSwiXFwuJCIpLA0KICAgICAgICAgWDI0NSA9IHN0cl9yZW1vdmUoWDI0NSwiXFxbIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCJcXF0iKSwNCiAgICAgICAgIG5hendpc2tvID0gaWZlbHNlKGdyZXBsKCIgW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5cXC5dKiAiLFgyNDUpLGFzLmNoYXJhY3RlcihYMjQ1KSxzdHJfcmVwbGFjZShYMjQ1LCIoXi4qPykoICkoPyEuKiApKC4qJCkiLCJcXDMiKSksDQogICAgICAgICBpbWllID0gaWZlbHNlKGdyZXBsKCIgW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5cXC5dKiAiLFgyNDUpLCIqIixzdHJfcmVwbGFjZShYMjQ1LCIoXi4qPykoICkoPyEuKiApKC4qJCkiLCJcXDEiKSksDQogICAgICAgICBuYW1lID0gcGFzdGUobmF6d2lza28saW1pZSxzZXAgPSAiLCAiKSkgJT4lDQogIGlubmVyX2pvaW4oLixwYmxfdmlhZixieSA9IGMoIm5hbWUiID0gIkJOX25hbWUiKSkgJT4lDQogIGxlZnRfam9pbiguLFBCTF90d29yY3ksYnkgPSBjKCJwYmxfaWQiPSJUV19UV09SQ0FfSUQiKSkgJT4lDQogIGxlZnRfam9pbiguLHJlZGFrdG9yenlfZHppYWxvdyxieSA9IGMoIlRXX0RaX0RaSUFMX0lEIj0iRFpfRFpJQUxfSUQiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxUV19UV09SQ0FfSUQ9cGJsX2lkLFRXX05BWldJU0tPLFRXX0lNSUUsRFpfRFpJQUxfSUQ9VFdfRFpfRFpJQUxfSUQsRFpfTkFaV0E9RFpfTkFaV0EueCxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBtdXRhdGUoUlpfUk9EWkFKX0lEID0gMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB0d8OzcmN5IChwb2RtaW90b3dhKSIpICU+JQ0KICB1bmlxdWUoKQ0KIyMjcHJ6eXBpc2FuaWUgcmVkYWt0b3JhIG5hIHBvZHN0YXdpZSB6Ymllxbxub8WbY2kgZnJheiBuYXpld25pY3R3YSBvc29ieSB6IDI0NSB6IHR3w7NyY8SFIHBibCAoZGxhIHR5Y2gsIGt0w7NyZSBuaWUgem9zdGHFgnkgem1hcG93YW5lIG5hIGxpbmlpIHBibC1ibikgLSBrc2nEhcW8a2kgdHfDs3JjeQ0Kd3Nwb2x3eWRhbmllX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09IndzcMOzxYJ3eWRhbmllIikgJT4lIA0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb193c3BvbHd5ZGFuaWExJFpBX1VXQUdJKQ0KDQpkb193c3BvbHd5ZGFuaWEyIDwtIHdzcG9sd3lkYW5pZV9yZWRha3Rvcnp5ICU+JSANCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpICU+JSANCiAgbXV0YXRlKFgyNDUgPSBzdHJfZXh0cmFjdChYMjQ1LCAiKD88PVxcL1xcJGMpKC4qPykoPz0gO3wkKSIpLA0KICAgICAgICAgWDI0NSA9IHN0cl9yZW1vdmUoWDI0NSwiXFwuJCIpLA0KICAgICAgICAgWDI0NSA9IHN0cl9yZW1vdmUoWDI0NSwiXFxbIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCJcXF0iKSwNCiAgICAgICAgIG5hendpc2tvID0gaWZlbHNlKGdyZXBsKCIgW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5cXC5dKiAiLFgyNDUpLGFzLmNoYXJhY3RlcihYMjQ1KSxzdHJfcmVwbGFjZShYMjQ1LCIoXi4qPykoICkoPyEuKiApKC4qJCkiLCJcXDMiKSksDQogICAgICAgICBpbWllID0gaWZlbHNlKGdyZXBsKCIgW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5cXC5dKiAiLFgyNDUpLCIqIixzdHJfcmVwbGFjZShYMjQ1LCIoXi4qPykoICkoPyEuKiApKC4qJCkiLCJcXDEiKSksDQogICAgICAgICBuYW1lID0gcGFzdGUobmF6d2lza28saW1pZSxzZXAgPSAiLCAiKSwNCiAgICAgICAgIG5hendhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihuYW1lKSwgIlxcVyIsICIiKSkgJT4lIA0KICBpbm5lcl9qb2luKC4sUEJMX3R3b3JjeV9wb2RtICU+JSBzZWxlY3QoVFdfVFdPUkNBX0lELFRXX05BWldJU0tPLFRXX0lNSUUsRFpfRFpJQUxfSUQ9VFdfRFpfRFpJQUxfSUQsRFpfTkFaV0EsbmF6d2EpLGJ5PSJuYXp3YSIpDQpkb193c3BvbHd5ZGFuaWEyJHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKGRvX3dzcG9sd3lkYW5pYTJbMTo0XSkpDQpkb193c3BvbHd5ZGFuaWEyIDwtIGRvX3dzcG9sd3lkYW5pYTIgJT4lIA0KICBhcnJhbmdlKFpBX1VXQUdJLG5hendpc2tvLGltaWUsbmF6d2EsVFdfVFdPUkNBX0lEKQ0KZG9fd3Nwb2x3eWRhbmlhMiA8LSBkb193c3BvbHd5ZGFuaWEyWyFkdXBsaWNhdGVkKGRvX3dzcG9sd3lkYW5pYTIkc2FtZSksXSAlPiUgDQogIG11dGF0ZShEWl9EWklBTF9JRCA9IGFzLmludGVnZXIoRFpfRFpJQUxfSUQpLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB0d8OzcmN5IChwb2RtaW90b3dhKSIpICU+JSANCiAgaW5uZXJfam9pbiguLHJlZGFrdG9yenlfZHppYWxvdyAlPiUgc2VsZWN0KERaX0RaSUFMX0lELHJlZGFrdG9yX2R6aWFsdSksYnk9IkRaX0RaSUFMX0lEIikgJT4lIA0KICBzZWxlY3QobmFtZXMoZG9fd3Nwb2x3eWRhbmlhMSkpDQojIyNwcnp5cGlzYW5pZSBhdXRvcsOzdyBwb2RtaW90b3dlaiBkbyBsaXRlcmF0dXIgaSBwcnp5cGlzYW5pZSBkbyByZWRha3RvcsOzdyBuYSBwb2RzdGF3aWUga29kdSBsaXRlcmF0dXJ5IHogcG9sYSBYMDgwIGkgdHdvcnplbmllIG5vd3ljaCB0d8OzcmPDs3cgbmEgcG9kc3Rhd2llIHBvbGEgMjQ1DQp3c3BvbHd5ZGFuaWVfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0id3Nww7PFgnd5ZGFuaWUiKSAlPiUgDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3dzcG9sd3lkYW5pYTEkWkFfVVdBR0kpICU+JSANCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fd3Nwb2x3eWRhbmlhMiRaQV9VV0FHSSkNCg0Kd3Nwb2x3eWRhbmllX3JlZGFrdG9yenkgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB3c3BvbHd5ZGFuaWVfcmVkYWt0b3J6eSBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbiBCTl9QQkxfbGlzdGFfbGl0ZXJhdHVyIGIgb24gYS5YMDgwIGxpa2UgKCclJ3x8Yi51a2Rfb2dvbG5lfHwnJScpIikNCmRvX3dzcG9sd3lkYW5pYTMgPC0gd3Nwb2x3eWRhbmllX3JlZGFrdG9yenkgJT4lIA0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSxwYmxfaWQscGJsX25hendhLHJlZGFrdG9yX2R6aWFsdSxwYmxfaWRfbGl0ZXJhdHVyeSxwYmxfbGl0ZXJhdHVyYSxuYXp3YV9wcm9zdGEsdWtkX29nb2xuZSkgJT4lIA0KICBtdXRhdGUoWDI0NSA9IHN0cl9leHRyYWN0KFgyNDUsICIoPzw9XFwvXFwkYykoLio/KSg/PSA7fCQpIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCJcXC4kIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCJcXFsiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsIlxcXSIpLA0KICAgICAgICAgbmF6d2lza28gPSBpZmVsc2UoZ3JlcGwoIiBbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvlxcLl0qICIsWDI0NSksYXMuY2hhcmFjdGVyKFgyNDUpLHN0cl9yZXBsYWNlKFgyNDUsIiheLio/KSggKSg/IS4qICkoLiokKSIsIlxcMyIpKSwNCiAgICAgICAgIGltaWUgPSBpZmVsc2UoZ3JlcGwoIiBbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvlxcLl0qICIsWDI0NSksIioiLHN0cl9yZXBsYWNlKFgyNDUsIiheLio/KSggKSg/IS4qICkoLiokKSIsIlxcMSIpKSwNCiAgICAgICAgIG5hbWUgPSBwYXN0ZShuYXp3aXNrbyxpbWllLHNlcCA9ICIsICIpKSAlPiUNCiAgbXV0YXRlKHBibF9uYXp3YSA9IGFzLmNoYXJhY3RlcihwYmxfbmF6d2EpKSAlPiUNCiAgbXV0YXRlKERaX0RaSUFMX0lEID0gaWZlbHNlKG5hendhX3Byb3N0YT09InBvbHNrIiZzdWJzdHIocGJsX25hendhLG5jaGFyKHBibF9uYXp3YSksbmNoYXIocGJsX25hendhKSkhPXN1YnN0cihuYXp3aXNrbywxLDEpLE5BLGFzLmludGVnZXIocGJsX2lkKSkpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksRFpfRFpJQUxfSUQpDQpjb3VudCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRvX3dzcG9sd3lkYW5pYTMkWkFfVVdBR0kpKQ0KZG9fd3Nwb2x3eWRhbmlhMyA8LSBtZXJnZShkb193c3BvbHd5ZGFuaWEzLGNvdW50LGJ5LnggPSAiWkFfVVdBR0kiLGJ5LnkgPSAiVmFyMSIpICU+JQ0KICBtdXRhdGUoZGx1Z29zYyA9IG5jaGFyKHVrZF9vZ29sbmUpKSAlPiUNCiAgYXJyYW5nZSgtRnJlcSxaQV9VV0FHSSwtZGx1Z29zYyxwYmxfaWQpDQpkb193c3BvbHd5ZGFuaWEzJHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKGRvX3dzcG9sd3lkYW5pYTNbMV0pKQ0KZG9fd3Nwb2x3eWRhbmlhMyA8LSBkb193c3BvbHd5ZGFuaWEzWyFkdXBsaWNhdGVkKGRvX3dzcG9sd3lkYW5pYTMkc2FtZSksXSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BKSAlPiUNCiAgcmVuYW1lKERaX05BWldBID0gcGJsX25hendhLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBuYXp3aXNrbywNCiAgICAgICAgIFRXX0lNSUUgPSBpbWllKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFRXX1RXT1JDQV9JRCxUV19OQVpXSVNLTyxUV19JTUlFLERaX0RaSUFMX0lELERaX05BWldBLHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIG11dGF0ZShSWl9ST0RaQUpfSUQgPSAxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHR3w7NyY3kgKHBvZG1pb3Rvd2EpIikNCiMjI3ByenlwaXNhbmllIGF1dG9yw7N3IHBvZG1pb3Rvd2VqIGRvIGxpdGVyYXR1ciBpIHByenlwaXNhbmllIGRvIHJlZGFrdG9yw7N3IG5hIHBvZHN0YXdpZSBsaXRlcmF0dXJ5IHogcG9sYSA2NTUgaSB0d29yemVuaWUgbm93eWNoIHR3w7NyY8OzdyBuYSBwb2RzdGF3aWUgcG9sYSAyNDUNCndzcG9sd3lkYW5pZV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJ3c3DDs8WCd3lkYW5pZSIpICU+JSANCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fd3Nwb2x3eWRhbmlhMSRaQV9VV0FHSSkgJT4lIA0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb193c3BvbHd5ZGFuaWEyJFpBX1VXQUdJKSAlPiUgDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3dzcG9sd3lkYW5pYTMkWkFfVVdBR0kpDQoNCiM2NTUNCm1hcmNfZmllbGRfNjU1IDwtIHdzcG9sd3lkYW5pZV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDY1NSklPiUNCiAgZmlsdGVyKFg2NTUhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTU9c3RyX3JlcGxhY2VfYWxsKFg2NTUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDY1NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjU1IT0iIikgJT4lDQogIG11dGF0ZShYNjU1PXN0cl9yZW1vdmVfYWxsKFg2NTUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDY1NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbCh3c3BvbHd5ZGFuaWVfcmVkYWt0b3J6eSRYNjU1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjU1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzY1NTwtY2JpbmQobWFyY19maWVsZF82NTUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF82NTUkWDY1NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzY1NSRYNjU1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQppZiAobnJvdyhtYXJjX2ZpZWxkXzY1NSk+MCkgew0KICANCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNjU1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNjU1JFg2NTUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzY1NSRYNjU1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCm1hcmNfZmllbGRfNjU1IDwtIG1hcmNfZmllbGRfNjU1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCkgJT4lDQogIHVuaXF1ZSgpDQoNCm1hcmNfZmllbGRfNjU1IDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWFyY19maWVsZF82NTUgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBQQkxfaGFzbGFfb3NvYm93ZSBiIG9uIGEuYCRhYCBsaWtlICgnJSd8fGIubmF6d2F8fCclJykiKQ0KDQojIyNkb2Rhd2FuaWUgbmF6ZXduaWN0dyBub3d5Y2ggdHfDs3Jjw7N3IG5hIHBvZHN0YXdpZSAyNDUNCm1hcmNfZmllbGRfMjQ1IDwtIHdzcG9sd3lkYW5pZV9yZWRha3Rvcnp5ICU+JSANCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpICU+JSANCiAgbXV0YXRlKFgyNDUgPSBzdHJfZXh0cmFjdChYMjQ1LCAiKD88PVxcL1xcJGMpKC4qPykoPz0gO3wkKSIpLA0KICAgICAgICAgWDI0NSA9IHN0cl9yZW1vdmUoWDI0NSwiXFwuJCIpLA0KICAgICAgICAgWDI0NSA9IHN0cl9yZW1vdmUoWDI0NSwiXFxbIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCJcXF0iKSwNCiAgICAgICAgIG5hendpc2tvID0gaWZlbHNlKGdyZXBsKCIgW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5cXC5dKiAiLFgyNDUpLGFzLmNoYXJhY3RlcihYMjQ1KSxzdHJfcmVwbGFjZShYMjQ1LCIoXi4qPykoICkoPyEuKiApKC4qJCkiLCJcXDMiKSksDQogICAgICAgICBpbWllID0gaWZlbHNlKGdyZXBsKCIgW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5cXC5dKiAiLFgyNDUpLCIqIixzdHJfcmVwbGFjZShYMjQ1LCIoXi4qPykoICkoPyEuKiApKC4qJCkiLCJcXDEiKSksDQogICAgICAgICBuYW1lID0gcGFzdGUobmF6d2lza28saW1pZSxzZXAgPSAiLCAiKSkNCiNqb2luIG5hIHBvZHN0YXdpZSBpZGVudHljem5lZ28gaWQNCm1hcmNfZmllbGRfNjU1IDwtIG1hcmNfZmllbGRfNjU1ICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKERaX0RaSUFMX0lEID0gaWZlbHNlKG5hendhPT0icG9sc2siJnN1YnN0cihEWl9OQVpXQSxuY2hhcihEWl9OQVpXQSksbmNoYXIoRFpfTkFaV0EpKSE9c3Vic3RyKG5hendpc2tvLDEsMSksTkEsYXMuaW50ZWdlcihEWl9EWklBTF9JRCkpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLERaX0RaSUFMX0lEKQ0KbWFyY19maWVsZF82NTUkc2FtZSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTVbMV0pKQ0KZG9fd3Nwb2x3eWRhbmlhNCA8LSBtYXJjX2ZpZWxkXzY1NVshZHVwbGljYXRlZChtYXJjX2ZpZWxkXzY1NSRzYW1lKSxdICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksRFpfRFpJQUxfSUQsRFpfTkFaV0EsVFdfTkFaV0lTS089bmF6d2lza28sVFdfSU1JRT1pbWllLHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB0d8OzcmN5IChwb2RtaW90b3dhKSIpICU+JQ0KICBzZWxlY3QobmFtZXMoZG9fd3Nwb2x3eWRhbmlhMykpDQp9IGVsc2Ugew0KICBtYXJjX2ZpZWxkXzI0NSA8LSB3c3BvbHd5ZGFuaWVfcmVkYWt0b3J6eSAlPiUgDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSAlPiUgDQogIG11dGF0ZShYMjQ1ID0gc3RyX2V4dHJhY3QoWDI0NSwgIig/PD1cXC9cXCRjKSguKj8pKD89IDt8JCkiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsIlxcLiQiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsIlxcWyIpLA0KICAgICAgICAgWDI0NSA9IHN0cl9yZW1vdmUoWDI0NSwiXFxdIiksDQogICAgICAgICBuYXp3aXNrbyA9IGlmZWxzZShncmVwbCgiIFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XFwuXSogIixYMjQ1KSxhcy5jaGFyYWN0ZXIoWDI0NSksc3RyX3JlcGxhY2UoWDI0NSwiKF4uKj8pKCApKD8hLiogKSguKiQpIiwiXFwzIikpLA0KICAgICAgICAgaW1pZSA9IGlmZWxzZShncmVwbCgiIFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XFwuXSogIixYMjQ1KSwiKiIsc3RyX3JlcGxhY2UoWDI0NSwiKF4uKj8pKCApKD8hLiogKSguKiQpIiwiXFwxIikpLA0KICAgICAgICAgbmFtZSA9IHBhc3RlKG5hendpc2tvLGltaWUsc2VwID0gIiwgIikpDQogIGRvX3dzcG9sd3lkYW5pYTQgPC0gZGF0YS5mcmFtZShzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQp9DQojIyNwcnp5cGlzYW5pZSBhdXRvcsOzdyBwb2RtaW90b3dlaiBkbyBsaXRlcmF0dXIgaSBwcnp5cGlzYW5pZSBkbyByZWRha3RvcsOzdyBuYSBwb2RzdGF3aWUgbGl0ZXJhdHVyeSB6IHBvbGEgNjUwIGkgdHdvcnplbmllIG5vd3ljaCB0d8OzcmPDs3cgbmEgcG9kc3Rhd2llIHBvbGEgMjQ1DQp3c3BvbHd5ZGFuaWVfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0id3Nww7PFgnd5ZGFuaWUiKSAlPiUgDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3dzcG9sd3lkYW5pYTEkWkFfVVdBR0kpICU+JSANCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fd3Nwb2x3eWRhbmlhMiRaQV9VV0FHSSkgJT4lIA0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb193c3BvbHd5ZGFuaWEzJFpBX1VXQUdJKSAlPiUgDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3dzcG9sd3lkYW5pYTQkWkFfVVdBR0kpDQoNCiM2NTANCmlmIChtYXgobmNoYXIod3Nwb2x3eWRhbmllX3JlZGFrdG9yenkkWDY1MCkpPjApIHsNCm1hcmNfZmllbGRfNjUwIDwtIHdzcG9sd3lkYW5pZV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDY1MCklPiUNCiAgZmlsdGVyKFg2NTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTA9c3RyX3JlcGxhY2VfYWxsKFg2NTAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDY1MCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjUwIT0iIikgJT4lDQogIG11dGF0ZShYNjUwPXN0cl9yZW1vdmVfYWxsKFg2NTAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDY1MCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbCh3c3BvbHd5ZGFuaWVfcmVkYWt0b3J6eSRYNjUwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjUwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzY1MDwtY2JpbmQobWFyY19maWVsZF82NTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF82NTAkWDY1MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzY1MCRYNjUwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzY1MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzY1MCRYNjUwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF82NTAkWDY1MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzY1MCA8LSBtYXJjX2ZpZWxkXzY1MCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWApICU+JQ0KICB1bmlxdWUoKQ0KDQptYXJjX2ZpZWxkXzY1MCA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG1hcmNfZmllbGRfNjUwIGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gUEJMX2hhc2xhX29zb2Jvd2UgYiBvbiBhLmAkYWAgbGlrZSAoJyUnfHxiLm5hendhfHwnJScpIikgICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKERaX0RaSUFMX0lEID0gaWZlbHNlKG5hendhPT0icG9sc2siJnN1YnN0cihEWl9OQVpXQSxuY2hhcihEWl9OQVpXQSksbmNoYXIoRFpfTkFaV0EpKSE9c3Vic3RyKG5hendpc2tvLDEsMSksTkEsYXMuaW50ZWdlcihEWl9EWklBTF9JRCkpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLERaX0RaSUFMX0lEKQ0KDQptYXJjX2ZpZWxkXzY1MCRzYW1lIDwtIGN1bXN1bSghZHVwbGljYXRlZChtYXJjX2ZpZWxkXzY1MFsxXSkpDQpkb193c3BvbHd5ZGFuaWE1IDwtIG1hcmNfZmllbGRfNjUwWyFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjUwJHNhbWUpLF0gJT4lDQogIHNlbGVjdChaQV9VV0FHSSxEWl9EWklBTF9JRCxEWl9OQVpXQSxUV19OQVpXSVNLTz1uYXp3aXNrbyxUV19JTUlFPWltaWUscmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpICU+JQ0KICBtdXRhdGUoVFdfVFdPUkNBX0lEID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHR3w7NyY3kgKHBvZG1pb3Rvd2EpIikgJT4lDQogIHNlbGVjdChuYW1lcyhkb193c3BvbHd5ZGFuaWE0KSkNCn0gZWxzZSB7DQogIGRvX3dzcG9sd3lkYW5pYTUgPC0gZG9fd3Nwb2x3eWRhbmlhMVswLF0NCn0NCiNjbyB6b3N0YcWCbyBkbyB3c3DDs8WCd3lkYW5pYT8NCndzcG9sd3lkYW5pZV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJ3c3DDs8WCd3lkYW5pZSIpICU+JSANCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fd3Nwb2x3eWRhbmlhMSRaQV9VV0FHSSkgJT4lIA0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb193c3BvbHd5ZGFuaWEyJFpBX1VXQUdJKSAlPiUgDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3dzcG9sd3lkYW5pYTMkWkFfVVdBR0kpICU+JSANCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fd3Nwb2x3eWRhbmlhNCRaQV9VV0FHSSkgJT4lIA0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb193c3BvbHd5ZGFuaWE1JFpBX1VXQUdJKQ0KDQojbmFkZGF0ZWsgcHJ6eXBpc2HEhyBNYXJjaWUgamFrbyBwb2RtaW90b3fEhSBiZXogdHfDs3Jjw7N3IGkgY3p5X2F1dG9tYXR5Y3puaWUgPC0gbmllDQpkb193c3BvbHd5ZGFuaWE2IDwtIHdzcG9sd3lkYW5pZV9yZWRha3Rvcnp5ICU+JQ0KICBtdXRhdGUoVFdfVFdPUkNBX0lEID0gTkEsDQogICAgICAgICBUV19OQVpXSVNLTyA9IE5BLA0KICAgICAgICAgVFdfSU1JRSA9IE5BLA0KICAgICAgICAgRFpfRFpJQUxfSUQgPSBOQSwNCiAgICAgICAgIERaX05BWldBID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHR3w7NyY3kgKHBvZG1pb3Rvd2EpIiwNCiAgICAgICAgIHJlZGFrdG9yX2R6aWFsdSA9ICJNQVJUQUt4IikgJT4lDQogIHNlbGVjdChuYW1lcyhkb193c3BvbHd5ZGFuaWE1KSkNCiN0cnplYmEgemFrdHVhbGl6b3dhxIcgdyBibl9vaywgxbxlIHRlcmF6IHRvIG5pZSBzxIUgYXV0b21hdHljem5lDQpsaXN0YV9kb19wcnplcGlzYW5pYSA8LSBkb193c3BvbHd5ZGFuaWE2JFpBX1VXQUdJDQpibl9vayRjenlfYXV0b21hdHljem5pZVtibl9vayRaQV9VV0FHSSAlaW4lIGxpc3RhX2RvX3ByemVwaXNhbmlhXSA8LSAibmllIg0KI3BvxYLEhWN6ZW5pZSBwcnp5ZHppYcWCdSB3c3DDs8WCd3lkYcWEIHcgamVkZW4gcGxpaw0KZG9fd3Nwb2x3eWRhbmlhIDwtIHJiaW5kKGRvX3dzcG9sd3lkYW5pYTEsZG9fd3Nwb2x3eWRhbmlhMixkb193c3BvbHd5ZGFuaWEzLGRvX3dzcG9sd3lkYW5pYTQsZG9fd3Nwb2x3eWRhbmlhNSxkb193c3BvbHd5ZGFuaWE2KQ0KDQojcG/FgsSFY3plbmllIHByenlkemlhxYLDs3cgdyBqZWRlbiBwbGlrICh6IHd5a2x1Y3plbmllbSB3c3DDs8WCd3lkYW5pYSwgYm8gb25vIGlkemllIHBvIHphX3V3YWdpKQ0KcmVkYWt0b3J6eV96YXBpc293IDwtIHJiaW5kKGRvX3BvZG1pb3Rvd2VqLGRvX3ByemVkbWlvdG93ZWosZG9fYW50b2xvZ2lpLGRvX3dzcG9sd3lkYW5pYSkNCiNwb8WCxIVjemVuaWUgcHJ6eXBpc2FuaWEgemUgemJpb3JlbQ0KDQpibl9vayA8LSBibl9vayAlPiUNCiAgbGVmdF9qb2luKC4scmVkYWt0b3J6eV96YXBpc293LGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBtdXRhdGUocmVkYWt0b3JfZHppYWx1ID0gaWZlbHNlKGlzLm5hKERaX05BWldBKSxhcy5jaGFyYWN0ZXIocmVkYWt0b3JfZHppYWx1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJIYXPFgmEgb3NvYm93ZSAobGl0ZXJhdHVyYSBwb2xza2EpIC0gQiIsIlBBVUxJTkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJIYXPFgmEgb3NvYm93ZSAobGl0ZXJhdHVyYSBwb2xza2EpIC0gRyIsIk1BUlRBSyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJIYXPFgmEgb3NvYm93ZSAobGl0ZXJhdHVyYSBwb2xza2EpIC0gTCIsIkJFQVRBSyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKERaX05BWldBPT0iTGl0ZXJhdHVyYSB3c3DDs8WCY3plc25hICh1dHdvcnkgYW5vbmltb3dlIGkgdWxvdG5lKSIsIkFOSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJVdHdvcnkgYW5vbmltb3dlIGkgdWxvdG5lIiwiQU5JQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJVdHdvcnkgYW5vbmltb3dlIGkgdWxvdG5lIChlcG9rYSBuaWV6bmFuYSkiLCJBTklBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJIYXPFgmEgb3NvYm93ZSAobGl0ZXJhdHVyYSBwb2xza2EpIC0gTiIsIkdPU0lBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKERaX05BWldBPT0iSGFzxYJhIG9zb2Jvd2UgKGxpdGVyYXR1cmEgcG9sc2thKSAtIE8iLCJJWkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKERaX05BWldBPT0iSGFzxYJhIG9zb2Jvd2UgKGxpdGVyYXR1cmEgcG9sc2thKSAtIFEiLCJJWkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09IkxpdGVyYXR1cmEgYnJ5dHlqc2thIGkgaXJsYW5kemthIiwiRVdBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKERaX05BWldBPT0iVXR3b3J5IGFub25pbW93ZSAoYnJ5dHlqc2thIGkgaXJsYW5kemthKSIsIkVXQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJIYXPFgmEgb3NvYm93ZSAobGl0ZXJhdHVyYSBwb2xza2EpIC0gVSIsIlBBVUxJTkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBYIiwiUEFVTElOQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBWIiwiUEFVTElOQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJIYXPFgmEgb3NvYm93ZSAobGl0ZXJhdHVyYSBwb2xza2EpIC0gWSIsIlBBVUxJTkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBDIiwiR09TSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJIYXPFgmEgb3NvYm93ZSAobGl0ZXJhdHVyYSBwb2xza2EpIC0gRCIsIkdPU0lBIixhcy5jaGFyYWN0ZXIocmVkYWt0b3JfZHppYWx1KSkpKSkpKSkpKSkpKSkpKSkpKSkNCg0KI3VqZWRub2xpY2VuaWUgbGl0ZXJhdHVyeSBkbGEga2lsa3UgemFwaXPDs3cgbm93ZWdvIHR3w7NyY3kNCmtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5IDwtIGJuX29rICU+JQ0KICBzZWxlY3QoaWQsVFdfVFdPUkNBX0lELFRXX05BWldJU0tPLFRXX0lNSUUsRFpfRFpJQUxfSUQsRFpfTkFaV0EscmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgZmlsdGVyKGlzLm5hKFRXX1RXT1JDQV9JRCkmIWlzLm5hKFRXX05BWldJU0tPKSkgJT4lDQogIHNlbGVjdCgtVFdfVFdPUkNBX0lEKSAlPiUNCiAgYXJyYW5nZShUV19OQVpXSVNLTyxUV19JTUlFKSAlPiUNCiAgZ3JvdXBfYnlfYXQodmFycygyOjMpKSAlPiUNCiAgbXV0YXRlKHVuaWthdG93eV9kemlhbCA9IHBhc3RlKHVuaXF1ZShEWl9EWklBTF9JRCksY29sbGFwc2UgPSAifCIpLA0KICAgICAgICAgRFpfRFpJQUxfSUQgPSBwYXN0ZShEWl9EWklBTF9JRCxjb2xsYXBzZSA9ICJ8IiksDQogICAgICAgICBEWl9OQVpXQSA9IHBhc3RlKERaX05BWldBLGNvbGxhcHNlID0gInwiKSwNCiAgICAgICAgIHJlZGFrdG9yX2R6aWFsdSA9IHBhc3RlKHJlZGFrdG9yX2R6aWFsdSxjb2xsYXBzZSA9ICJ8IiksDQogICAgICAgICBpZCA9IHBhc3RlKGlkLGNvbGxhcHNlID0gInwiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGZpbHRlcihncmVwbCgiXFx8Iix1bmlrYXRvd3lfZHppYWwpKSAlPiUNCiAgc2VsZWN0KC11bmlrYXRvd3lfZHppYWwpDQppZihucm93KGtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5KT4wKSB7DQogIGtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5IDwtIGtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5ICU+JQ0KICBtdXRhdGUoaWRfZ3J1cHkgPSAxOm5yb3coLikpICU+JQ0KICBjU3BsaXQoLixjKCJpZCIsIkRaX0RaSUFMX0lEIiwiRFpfTkFaV0EiLCJyZWRha3Rvcl9kemlhbHUiKSxzZXAgPSAifCIsZGlyZWN0aW9uID0gImxvbmciKQ0KDQpraWxrYV9saXRlcmF0dXJfbm93ZWdvX3R3b3JjeVssMjo3XVtkdXBsaWNhdGVkKGtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5JGlkX2dydXB5KSxdIDwtIE5BDQpraWxrYV9saXRlcmF0dXJfbm93ZWdvX3R3b3JjeSA8LSBmaWxsXyhraWxrYV9saXRlcmF0dXJfbm93ZWdvX3R3b3JjeSwgbmFtZXMoa2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3kpKQ0KI3pha3R1YWxpem93YW5pZSB6YmlvcnUgcG9kbWlvdG93eWNoIG8gdWplZG5vbGljb25lIGR6aWHFgnkgZGxhIG5vd3ljaCB0d8OzcmPDs3cNCnggPC0gMTpsZW5ndGgoa2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3kkaWQpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIGJuX29rJERaX0RaSUFMX0lEW2JuX29rJGlkPT1raWxrYV9saXRlcmF0dXJfbm93ZWdvX3R3b3JjeSRpZFtpXV0gPC0ga2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3kkRFpfRFpJQUxfSURbaV0NCiAgYm5fb2skRFpfTkFaV0FbYm5fb2skaWQ9PWtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5JGlkW2ldXSA8LSBhcy5jaGFyYWN0ZXIoa2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3kkRFpfTkFaV0EpW2ldDQogIGJuX29rJHJlZGFrdG9yX2R6aWFsdVtibl9vayRpZD09a2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3kkaWRbaV1dIDwtIGFzLmNoYXJhY3RlcihraWxrYV9saXRlcmF0dXJfbm93ZWdvX3R3b3JjeSRyZWRha3Rvcl9kemlhbHUpW2ldDQp9DQp9DQoNCiNqZcWbbGkgbmllIG1hIGR6aWHFgnUgbHViIHJvZHphanUgemFwaXN1LCB0byB3cGlzYcSHIGlkIGkgbmF6d8SZIGRvIHVzdGFsZW5pYQ0KYm5fb2sgPC0gYm5fb2sgJT4lDQogIG11dGF0ZShEWl9EWklBTF9JRCA9aWZlbHNlKGlzLm5hKERaX0RaSUFMX0lEKSwwLGFzLmludGVnZXIoRFpfRFpJQUxfSUQpKSwNCiAgICAgICAgIERaX05BWldBID0gaWZlbHNlKGlzLm5hKERaX05BWldBKSwiLS0gZG8gdXN0YWxlbmlhIC0tIixhcy5jaGFyYWN0ZXIoRFpfTkFaV0EpKSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9aWZlbHNlKGlzLm5hKFJaX1JPRFpBSl9JRCksMCxhcy5pbnRlZ2VyKFJaX1JPRFpBSl9JRCkpLA0KICAgICAgICAgUlpfTkFaV0EgPSBpZmVsc2UoaXMubmEoUlpfTkFaV0EpLCItLSBkbyB1c3RhbGVuaWEgLS0iLGFzLmNoYXJhY3RlcihSWl9OQVpXQSkpKQ0KDQojdXN1bmnEmWNpZSBuYWR3ecW8a2kgeiBrc2nEhcW8ZWsgeiBkemlhxYLDs3cgSUgNCnNsb3duaWtpX2plenlrb3dlX3psZSA8LSBibl9vayAlPiUgDQogIGZpbHRlcihEWl9OQVpXQT09IlPFgm93bmlraSBqxJl6eWtvd2UiKSAlPiUgDQogIGZpbHRlcighZ3JlcGwoInPFgm93bmlrIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSkpDQoNCnNsb3duaWtpX2Jpb2dyYWZpY3puZV96bGUgPC0gYm5fb2sgJT4lIA0KICBmaWx0ZXIoRFpfTkFaV0E9PSJTxYJvd25pa2kgYmlvZ3JhZmljem5lIikgJT4lIA0KICBmaWx0ZXIoIShncmVwbCgiU8WCb3duaWsgYmlvZ3JhZmljem55fEJpb2dyYWZpYSIsWDY1NSkmKGdyZXBsKCJwaXNhcnp8bGl0ZXJhfGFrdG9yfHNjZW5vZ3JhZnxuYXVjenljaWVsfGFrYWRlbWl8bmF1a3xmaWxvbG9nfGtyeXR5fGxpdFxcLiIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJwaXNhcnp8bGl0ZXJhfGFrdG9yfHNjZW5vZ3JhZnxuYXVjenljaWVsfGFrYWRlbWl8bmF1a3xmaWxvbG9nfGtyeXR5fGxpdFxcLiIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpKSkpDQoNCmJuX29rIDwtIGJuX29rICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBzbG93bmlraV9qZXp5a293ZV96bGUkWkFfVVdBR0kpICU+JSANCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgc2xvd25pa2lfYmlvZ3JhZmljem5lX3psZSRaQV9VV0FHSSkNCmNodW5rMTEgPC0gYm5fb2sNCmBgYA0KDQpgYGB7ciBzdGF0eXN0eWtpIHByYWNvd25pa8Ozd30NCiNiZXpwaWVjem5payAtIHNwcmF3ZMW6LCBjenkgcm96a8WCYWQgamVzdCBuaWVrb250cm93ZXJzeWpueQ0KI2JleiBhdXRvbWF0dQ0KYm5fb2sgPC0gY2h1bmsxMQ0KY291bnQgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShibl9vayRyZWRha3Rvcl9kemlhbHUsYm5fb2skY3p5X2F1dG9tYXR5Y3puaWUpKSAlPiUgDQogIGZpbHRlcihWYXIyPT0ibmllIikgJT4lIA0KICBhcnJhbmdlKC1GcmVxKQ0KDQojaWxlIGtzacSFxbxlayBtYSBhdXRvbWF0DQoNCmNvdW50MiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGJuX29rJGN6eV9hdXRvbWF0eWN6bmllKSkNCg0KI3JlYWxuZSBzdGF0eXN0eWtpIHBvIHBvZG1pb3Rvd2VqDQojIHRlc3QgPC0gYm5fb2sgJT4lDQojICAgbGVmdF9qb2luKG91dCAlPiUgc2VsZWN0KHJla29yZF9CTixwcmFjb3duaWspLGJ5PWMoIlpBX1VXQUdJIj0icmVrb3JkX0JOIikpICU+JQ0KIyAgIG11dGF0ZShwcmFjb3duaWsgPSBpZmVsc2UoaXMubmEocHJhY293bmlrKSxhcy5jaGFyYWN0ZXIocmVkYWt0b3JfZHppYWx1KSxhcy5jaGFyYWN0ZXIocHJhY293bmlrKSksDQojICAgICAgICAgIHByYWNvd25payA9IHN0cl9yZXBsYWNlKHByYWNvd25paywiKF4uKj8pKFxcXy4qJCkiLCJcXDEiKSkNCiMgDQojIGNvdW50MyA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHRlc3QkcHJhY293bmlrKSkgJT4lIA0KIyAgIGFycmFuZ2UoLUZyZXEpDQojIA0KIyBjb3VudDQgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZSh0ZXN0JHByYWNvd25payx0ZXN0JERaX05BWldBKSkgJT4lDQojICAgZmlsdGVyKFZhcjE9PSJFV0EiJkZyZXE+MCkgJT4lDQojICAgYXJyYW5nZSgtRnJlcSkNCmBgYA0KDQpgYGB7ciBrc2nEhcW8a2kgcG9kbWlvdG93ZX0NCmJuX29rIDwtIGNodW5rMTENCmRhdGEgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiKSAlPiUNCiAgbXV0YXRlKHJlZGFrdG9yX2R6aWFsdSA9IHBhc3RlKHJlZGFrdG9yX2R6aWFsdSwiX3BvZG0iLHNlcCA9ICIiKSkNCg0KI3V3b2xuaWVuaWUga29sdW1uIHogZGFueW1pIHogYm4gaSBwcnpldHdvcnplbmllIGRvIFBCTA0KIzE6IHphX3V3YWdpLCByel9uYXp3YSwgemFfcm9fcm9rLCB6YV90eXBlLCByel9yb2R6YWpfaWQsIHR3X3R3b3JjYV9pZCwgdHdfbmF6d2lza28sIHR3X2ltaWUsIGR6X2R6aWFsX2lkLCBkel9uYXp3YSwgcmVkYWt0b3JfZHppYWx1DQpwb2xhX3BibCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIFJaX05BWldBLCBaQV9ST19ST0sgPSByb2ssIFJaX1JPRFpBSl9JRCwgVFdfVFdPUkNBX0lELCBUV19OQVpXSVNLTywgVFdfSU1JRSwgRFpfRFpJQUxfSUQsIERaX05BWldBLCByZWRha3Rvcl9kemlhbHUpICU+JQ0KICBtdXRhdGUoWkFfVFlQRSA9ICJLUyIpDQojMjogYXV0b3INCkJOX2F1dG9yIDwtIGRhdGEgJT4lDQogIHNlbGVjdChYMTAwLFgyNDUsWkFfVVdBR0kpDQojcG9sZSAxMDANCm1hcmNfZmllbGRfMTAwIDwtIEJOX2F1dG9yICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDEwMCklPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlcGxhY2VfYWxsKFgxMDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDEwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZW1vdmVfYWxsKFgxMDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChCTl9hdXRvciRYMTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzEwMDwtY2JpbmQobWFyY19maWVsZF8xMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8xMDAkWDEwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzEwMCRYMTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzEwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzEwMCRYMTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8xMDAkWDEwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQojcG9sZSAyNDUNCm1hcmNfZmllbGRfMjQ1IDwtIEJOX2F1dG9yICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSklPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChCTl9hdXRvciRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQpCTl9hdXRvciA8LSBtYXJjX2ZpZWxkXzEwMCAlPiUNCiBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGJgKSAlPiUNCiB1bmlxdWUoKSAlPiUNCiBtdXRhdGUoYCRhYCA9IGlmZWxzZSghaXMubmEoYCRiYCkscGFzdGUoYCRhYCxgJGJgLHNlcCA9ICIgIiksYXMuY2hhcmFjdGVyKGAkYWApKSkgJT4lDQogbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIig/PD1bYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pKFxcLiQpIikpICU+JQ0KIHVuaXF1ZSgpICU+JQ0KIG11dGF0ZShBTV9OQVpXSVNLTyA9IGlmZWxzZShncmVwbCgiXFx8IixgJGFgKSwgc3RyX3JlcGxhY2VfYWxsKHN0cl9yZW1vdmVfYWxsKGAkYWAsIiwiKSwiXFx8IiwiLCAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIsIixgJGFgKSxzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKC4qPykoLCApKC4qKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihgJGFgKSkpLA0KICAgICAgICBBTV9JTUlFID0gaWZlbHNlKGdyZXBsKCJcXHwiLGAkYWApLCIqIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIiwiLGAkYWApLHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSkpICU+JQ0KIHNlbGVjdChaQV9VV0FHSSxBTV9OQVpXSVNLTyxBTV9JTUlFKSAlPiUNCiBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSwgWDI0NWMgPSBgJGNgKQ0KICANCnggPC0gMTpsZW5ndGhzKEJOX2F1dG9yWzFdKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgQk5fYXV0b3IkY3p5X25hendpc2tvW2ldIDwtIGdyZXBsKEJOX2F1dG9yJEFNX05BWldJU0tPW2ldLEJOX2F1dG9yJFgyNDVjW2ldKQ0KICBCTl9hdXRvciRjenlfaW1pZVtpXSA8LSBncmVwbChCTl9hdXRvciRBTV9JTUlFW2ldLEJOX2F1dG9yJFgyNDVjW2ldKQ0KfQ0KDQpCTl9hdXRvciA8LSBCTl9hdXRvciAlPiUNCiAgbXV0YXRlKFpBX0FETk9UQUNKRSA9IGlmZWxzZShjenlfbmF6d2lza289PUZBTFNFfGN6eV9pbWllPT1GQUxTRSxwYXN0ZSgiVVdBR0EhIEtvbmZsaWt0IHcgZGFueWNoIG9zb2Jvd3ljaCB3IHBvbGFjaCAxMDAgaSAyNDUuIFBvcsOzd25haiBwb2xlIGF1dG9yIHcgZm9ybXVsYXJ6dSB6IHBvbGVtIEJOOiAiLFgyNDVjLHNlcCA9ICIiKSxOQSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSxaQV9BRE5PVEFDSkUpICU+JQ0KICBtdXRhdGUobmF6d2EgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKHBhc3RlKEFNX05BWldJU0tPLEFNX0lNSUUsIHNlcCA9ICIiKSksICJcXFciLCAiIikpICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfYXV0b3J6eSAlPiUgc2VsZWN0KEFNX0FVVE9SX0lELEFNX0tSWVBUT05JTSxBTV9MSUNaQkFfWkFQSVNPVyxuYXp3YSkgJT4lIGZpbHRlcihpcy5uYShBTV9LUllQVE9OSU0pKSxieT0ibmF6d2EiKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSxBTV9OQVpXSVNLTyxBTV9JTUlFLC1BTV9MSUNaQkFfWkFQSVNPVykNCkJOX2F1dG9yJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZChCTl9hdXRvclsxOjNdKSkNCkJOX2F1dG9yIDwtIEJOX2F1dG9yWyFkdXBsaWNhdGVkKEJOX2F1dG9yJGlkX2dydXB5KSxdICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSxaQV9BRE5PVEFDSkUsQU1fQVVUT1JfSUQpDQoNCiMzOiB0eXR1xYINCiNwb2xlIDI0NQ0KbWFyY19maWVsZF8yNDUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIn4iKSwNCiAgICAgICAgIFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ1PC1jYmluZChtYXJjX2ZpZWxkXzI0NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NSRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ1JFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ1JFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NSRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQppZigiJG4iICVpbiUgY29sbmFtZXMobWFyY19maWVsZF8yNDUpKSB7DQptYXJjX2ZpZWxkXzI0NSA8LSBtYXJjX2ZpZWxkXzI0NSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCxgJG5gLGAkcGApICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICAgYCRiYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGJgKSwiIixhcy5jaGFyYWN0ZXIoYCRiYCkpLGNvbGxhcHNlID0gIiAiKSwNCiAgICAgICAgIGAkbmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRuYCksIiIsYXMuY2hhcmFjdGVyKGAkbmApKSxjb2xsYXBzZSA9ICIgIiksDQogICAgICAgICBgJHBgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkcGApLCIiLGFzLmNoYXJhY3RlcihgJHBgKSksY29sbGFwc2UgPSAiICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgdW5pdGUoIlpBX1RZVFVMIixgJGFgOmAkcGAsc2VwID0gIiAiLG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoWkFfVFlUVUwgPSBzdHJfcmVwbGFjZV9hbGwoWkFfVFlUVUwsIiArIiwiICIpLA0KICAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVtb3ZlKFpBX1RZVFVMLCAiXFxzK1xcL1xcc3swLH0kIiksDQogICAgICAgICBaQV9UWVRVTCA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSxhcy5jaGFyYWN0ZXIoWkFfVFlUVUwpKSkpKSwNCiAgICAgICAgIFpBX1RZVFVMID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLGFzLmNoYXJhY3RlcihaQV9UWVRVTCkpKSkpLA0KICAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVwbGFjZV9hbGwoWkFfVFlUVUwsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiIDsgIiwiLiAiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gZ3N1YigiKCA6ICkoLikiLCIuIFxcVVxcMiIscGVybD1UUlVFLFpBX1RZVFVMKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxaQV9UWVRVTCkNCn0gZWxzZSB7DQogIG1hcmNfZmllbGRfMjQ1IDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGJgKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGFgKSwiIixhcy5jaGFyYWN0ZXIoYCRhYCkpLGNvbGxhcHNlID0gIiAiKSwNCiAgICAgICAgIGAkYmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSxjb2xsYXBzZSA9ICIgIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICB1bml0ZSgiWkFfVFlUVUwiLGAkYWA6YCRiYCxzZXAgPSAiICIsbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiICsiLCIgIiksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZW1vdmUoWkFfVFlUVUwsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLGFzLmNoYXJhY3RlcihaQV9UWVRVTCkpKSkpLA0KICAgICAgICAgWkFfVFlUVUwgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksYXMuY2hhcmFjdGVyKFpBX1RZVFVMKSkpKSksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCIgOyAiLCIuICIpLA0KICAgICAgICAgWkFfVFlUVUwgPSBnc3ViKCIoIDogKSguKSIsIi4gXFxVXFwyIixwZXJsPVRSVUUsWkFfVFlUVUwpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFpBX1RZVFVMKQ0KfQ0KI2RvcGlzYW5pZSBnYXR1bmt1IGRvIHByemVkbWlvdG93ZWogbmEgcG9kc3Rhd2llIDY1NSBpIDY1MCAgDQpnYXR1bmtpX3BibCA8LSBkYXRhLmZyYW1lKGdhdHVuZWsgPSBjKCJhZm9yeXptIiwgImFsYnVtIiwgImFudG9sb2dpYSIsICJhdXRvYmlvZ3JhZmlhIiwgImR6aWVubmlrIiwgImVzZWoiLCAiZmVsaWV0b24iLCAiaW5uZSIsICJrYXphbmllIiwgImxpc3QiLCAibWluaWF0dXJhIHByb3rEhSIsICJvcG93aWFkYW5pZSIsICJwb2VtYXQiLCAicG93aWXFm8SHIiwgInByb3phIiwgInByb3phIHBvZXR5Y2thIiwgInJlcG9ydGHFvCIsICJyb3ptecWbbGFuaWUgcmVsaWdpam5lIiwgInJ5c3VuZWssIG9icmF6IiwgInNjZW5hcml1c3oiLCAic3praWMiLCAidGVrc3QgYmlibGlqbnkiLCAidGVrc3QgZHJhbWF0eWN6bnkiLCAiZHJhbWF0IiwgIndpZXJzeiIsICJ3c3BvbW5pZW5pYSIsICJ3eXBvd2llZMW6IiwgInBhbWnEmXRuaWtpIiwgInBvZXpqYSIsICJsaXRlcmF0dXJhIHBvZHLDs8W8bmljemEiLCAic2F0eXJhIiwgInBpb3NlbmthIikpDQoNCiNkcmFtYXQsIHBhbWnEmXRuaWtpLCBwb2V6amEsIGxpdGVyYXR1cmEgcG9kcsOzxbxuaWN6YSwgc2F0eXJhLCBwaW9zZW5rYQ0KZ2F0dW5raV9ibiA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDY1NSxYNjUwKQ0KDQpnYXR1bmtpX2JuIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICBmcm9tIGdhdHVua2lfYm4NCiAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIGdhdHVua2lfcGJsIG9uIGxvd2VyKGdhdHVua2lfYm4uWDY1NSkgbGlrZSAnJSd8fGdhdHVua2lfcGJsLmdhdHVuZWt8fCclJyIpDQpnYXR1bmtpX2JuIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgIGZyb20gZ2F0dW5raV9ibg0KICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBnYXR1bmtpX3BibCBvbiBsb3dlcihnYXR1bmtpX2JuLlg2NTApIGxpa2UgJyUnfHxnYXR1bmtpX3BibC5nYXR1bmVrfHwnJSciKQ0KY29sbmFtZXMoZ2F0dW5raV9ibilbNV0gPC0gImdhdHVuZWsyIg0KZ2F0dW5raV9ibiA8LSBnYXR1bmtpX2JuICU+JQ0KICBtdXRhdGUoZ2F0dW5layA9IGlmZWxzZShpcy5uYShnYXR1bmVrKSYhaXMubmEoZ2F0dW5lazIpLGFzLmNoYXJhY3RlcihnYXR1bmVrMiksYXMuY2hhcmFjdGVyKGdhdHVuZWspKSwNCiAgICAgICAgIGdhdHVuZWsgPSBpZmVsc2UoZ3JlcGwoInByenlwb3dpZcWbxIciLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKSYhZ3JlcGwoIlteeV1wb3dpZcWbxIciLFg2NTUpJmdhdHVuZWs9PSJwb3dpZcWbxIciLCJvcG93aWFkYW5pZSIsYXMuY2hhcmFjdGVyKGdhdHVuZWspKSkgJT4lDQogIGZpbHRlcighaXMubmEoZ2F0dW5laykpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksZ2F0dW5laykgJT4lDQogIG11dGF0ZShnYXR1bmVrID0gaWZlbHNlKGdhdHVuZWs9PSJkcmFtYXQiLCJ0ZWtzdCBkcmFtYXR5Y3pueSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnYXR1bmVrPT0icGFtacSZdG5pa2kiLCJ3c3BvbW5pZW5pYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2F0dW5laz09InBvZXpqYSIsIndpZXJzeiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdhdHVuZWs9PSJsaXRlcmF0dXJhIHBvZHLDs8W8bmljemEiLCJyZXBvcnRhxbwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2F0dW5laz09InBpb3NlbmthIiwid2llcnN6Iixhcy5jaGFyYWN0ZXIoZ2F0dW5laykpKSkpKSkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKGdhdHVuZWsgPSBwYXN0ZShnYXR1bmVrLGNvbGxhcHNlID0gIiwgIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUoZ2F0dW5layA9IGdzdWIoIiheLikiLCJcXFVcXDEiLHBlcmwgPSBUUlVFLCBnYXR1bmVrKSkNCiNwb8WCxIVjemVuaWUgdHl0dcWCdSB6IGdhdHVua2llbQ0KemFfdHl0dWwgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIGxlZnRfam9pbiguLGdhdHVua2lfYm4sYnk9IlpBX1VXQUdJIikgJT4lIA0KICBtdXRhdGUoZ2F0dW5layA9IHBhc3RlKCJbIixnYXR1bmVrLCJdIixzZXAgPSAiIiksDQogICAgICAgICBnYXR1bmVrID0gaWZlbHNlKGdhdHVuZWs9PSJbTkFdIixOQSxhcy5jaGFyYWN0ZXIoZ2F0dW5laykpKSAlPiUgDQogIHVuaXRlKCJaQV9UWVRVTCIsIFpBX1RZVFVMOmdhdHVuZWssIHNlcCA9ICIuICIsbmEucm09VFJVRSkgJT4lIA0KICBtdXRhdGUoWkFfVFlUVUwgPSBzdHJfcmVwbGFjZV9hbGwoWkFfVFlUVUwsIlxcLiBcXC4iLCIuICIpLA0KICAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVwbGFjZShaQV9UWVRVTCwiKFxcISkoXFwuKXwoXFw/KShcXC4pIiwiXFwxIikpDQoNCiM0OiB0eXR1xYIgb3J5Z2luYcWCdQ0KI3BvbGUgMjQ2DQptYXJjX2ZpZWxkXzI0NiA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NiklPiUNCiAgZmlsdGVyKFgyNDYhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDY9c3RyX3JlbW92ZV9hbGwoWDI0NiwifiIpLA0KICAgICAgICAgWDI0Nj1zdHJfcmVwbGFjZV9hbGwoWDI0NiwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ2IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDYhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDY9c3RyX3JlbW92ZV9hbGwoWDI0NiwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ2LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NiwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NilbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDY8LWNiaW5kKG1hcmNfZmllbGRfMjQ2LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ2JFgyNDYgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDYkWDI0NixzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDZbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDYkWDI0Niksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ2JFgyNDYpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCmlmKCIkbiIgJWluJSBjb2xuYW1lcyhtYXJjX2ZpZWxkXzI0NikpIHsNCm1hcmNfZmllbGRfMjQ2IDwtIG1hcmNfZmllbGRfMjQ2WywgY29sU3Vtcyhpcy5uYShtYXJjX2ZpZWxkXzI0NikpICE9IG5yb3cobWFyY19maWVsZF8yNDYpXSAlPiUNCiAgZmlsdGVyKGdyZXBsKCJvcnlnIixYMjQ2KSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgLGAkYmAsYCRuYCxgJHBgKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGFgKSwiIixhcy5jaGFyYWN0ZXIoYCRhYCkpLGNvbGxhcHNlID0gIiwgIiksDQogICAgICAgICBgJGJgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYmApLCIiLGFzLmNoYXJhY3RlcihgJGJgKSksY29sbGFwc2UgPSAiIiksDQogICAgICAgICBgJG5gID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkbmApLCIiLGFzLmNoYXJhY3RlcihgJG5gKSksY29sbGFwc2UgPSAiIiksDQogICAgICAgICBgJHBgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkcGApLCIiLGFzLmNoYXJhY3RlcihgJHBgKSksY29sbGFwc2UgPSAiIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICB1bml0ZSgiWDI0NiIsYCRhYDpgJHBgLHNlcCA9ICIgIixuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKFgyNDYgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiICsiLCIgIiksDQogICAgICAgICBYMjQ2ID0gc3RyX3JlbW92ZShYMjQ2LCAiXFxzK1xcL1xcc3swLH0kIiksDQogICAgICAgICBYMjQ2ID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLGFzLmNoYXJhY3RlcihYMjQ2KSkpKSksDQogICAgICAgICBYMjQ2ID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICAgWDI0NiA9IHN0cl9yZXBsYWNlX2FsbChYMjQ2LCJcXC57M30gXFwuezN9IiwiLi4uICIpLA0KICAgICAgICAgWDI0NiA9IGdzdWIoIiggOiApKC4pIiwiLiBcXFVcXDIiLHBlcmw9VFJVRSxYMjQ2KSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSwgWDI0NikNCn0gZWxzZSB7DQogIG1hcmNfZmllbGRfMjQ2IDwtIG1hcmNfZmllbGRfMjQ2WywgY29sU3Vtcyhpcy5uYShtYXJjX2ZpZWxkXzI0NikpICE9IG5yb3cobWFyY19maWVsZF8yNDYpXSAlPiUNCiAgZmlsdGVyKGdyZXBsKCJvcnlnIixYMjQ2KSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgLGAkYmApICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiLCAiKSwNCiAgICAgICAgIGAkYmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSxjb2xsYXBzZSA9ICIiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIHVuaXRlKCJYMjQ2IixgJGFgOmAkYmAsc2VwID0gIiAiLG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoWDI0NiA9IHN0cl9yZXBsYWNlX2FsbChYMjQ2LCIgKyIsIiAiKSwNCiAgICAgICAgIFgyNDYgPSBzdHJfcmVtb3ZlKFgyNDYsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFgyNDYgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksYXMuY2hhcmFjdGVyKFgyNDYpKSkpKSwNCiAgICAgICAgIFgyNDYgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApezAsMX0oLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLGFzLmNoYXJhY3RlcihYMjQ2KSkpKSksDQogICAgICAgICBYMjQ2ID0gc3RyX3JlcGxhY2VfYWxsKFgyNDYsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgICBYMjQ2ID0gZ3N1YigiKCA6ICkoLikiLCIuIFxcVVxcMiIscGVybD1UUlVFLFgyNDYpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLCBYMjQ2KQ0KfQ0KDQojcG9sZSA1MDANCm1hcmNfZmllbGRfNTAwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNTAwKSU+JQ0KICBmaWx0ZXIoWDUwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMD1zdHJfcmVtb3ZlX2FsbChYNTAwLCJ+IiksDQogICAgICAgICBYNTAwPXN0cl9yZXBsYWNlX2FsbChYNTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg1MDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDUwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMD1zdHJfcmVtb3ZlX2FsbChYNTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg1MDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzUwMDwtY2JpbmQobWFyY19maWVsZF81MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF81MDAkWDUwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzUwMCRYNTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzUwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzUwMCRYNTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF81MDAkWDUwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF81MDAgPC0gbWFyY19maWVsZF81MDAgJT4lDQogIGZpbHRlcihncmVwbCgib3J5Z1xcLlxcOiIsWDUwMCkpICU+JQ0KICBtdXRhdGUoWDUwMCA9IHN0cl9yZW1vdmUoYCRhYCwiXlR5dFxcLiBvcnlnXFwuOiB8XlR5dFxcLCBvcnlnXFwuOiB8Xi4qP3R5dFxcLiBvcnlnXFwuOiAiKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVtb3ZlKFg1MDAsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFg1MDApLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFg1MDApLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsWDUwMCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFg1MDApLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFg1MDApLGFzLmNoYXJhY3RlcihYNTAwKSkpKSksDQogICAgICAgICBYNTAwID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFg1MDApLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSxhcy5jaGFyYWN0ZXIoWDUwMCkpKSkpLA0KICAgICAgICAgWDUwMCA9IHN0cl9yZXBsYWNlX2FsbChYNTAwLCJcXC57M30gXFwuezN9IiwiLi4uICIpLA0KICAgICAgICAgWDUwMCA9IHN0cl9yZW1vdmUoWDUwMCwgIlxcLiQiKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVtb3ZlKFg1MDAsIigsezAsMX0gezAsMX0pXFxkezR9LiokfCgsIHR8LiBUKXl0LiBvcnlnLiBjeWtsdToiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNTAwKQ0KI3R5dHXFgiBvcnlnaW5hxYJ1DQp6YV90eXR1bF9vcnlnaW5hbHUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8yNDYsYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTAwLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBtdXRhdGUoWDUwMCA9IGlmZWxzZShpcy5uYShYNTAwKSxOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJvcnlnIixYNTAwKSxOQSxhcy5jaGFyYWN0ZXIoWDUwMCkpKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoIWlzLm5hKFg1MDApJmdyZXBsKCJcXC4gLSAiLFg1MDApLHN0cl9yZXBsYWNlKFg1MDAsIiguKj8pKFxcLiAtIC4qJCkiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoWDUwMCkpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZSghaXMubmEoWDUwMCkmZ3JlcGwoIk5hIGtzacSFxbxjZSBwc2V1ZCIsWDUwMCksc3RyX3JlcGxhY2UoWDUwMCwiKC4qPykoXFwuIE5hIGtzacSFxbxjZSBwc2V1ZC4qJCkiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoWDUwMCkpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZSghaXMubmEoWDUwMCkmZ3JlcGwoIlByemVrxYJcXC4gd2ciLFg1MDApLHN0cl9yZXBsYWNlKFg1MDAsIiguKj8pKFxcLiBQcnpla8WCXFwuIHdnLiokKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihYNTAwKSksDQogICAgICAgICBaQV9UWVRVTF9PUllHSU5BTFUgPSBpZmVsc2UoaXMubmEoWDI0NikmaXMubmEoWDUwMCksTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKCFpcy5uYShYNTAwKSxhcy5jaGFyYWN0ZXIoWDUwMCksYXMuY2hhcmFjdGVyKFgyNDYpKSksDQogICAgICAgICBaQV9UWVRVTF9PUllHSU5BTFUgPSBzdHJfcmVtb3ZlX2FsbChaQV9UWVRVTF9PUllHSU5BTFUsJ1xcIicpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFpBX1RZVFVMX09SWUdJTkFMVSkNCiM1OiBqxJl6eWsgb3J5Z2luYcWCdQ0KbWFyY19maWVsZF8wNDEgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgwNDEpJT4lDQogIGZpbHRlcihYMDQxIT0iIikgJT4lDQogIG11dGF0ZShYMDQxPXN0cl9yZXBsYWNlX2FsbChYMDQxLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgwNDEiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDA0MSE9IiIpICU+JQ0KICBtdXRhdGUoWDA0MT1zdHJfcmVtb3ZlX2FsbChYMDQxLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgwNDEsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMDQxLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMDQxKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzA0MTwtY2JpbmQobWFyY19maWVsZF8wNDEsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8wNDEkWDA0MSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzA0MSRYMDQxLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzA0MVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzA0MSRYMDQxKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8wNDEkWDA0MSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KemFfamV6eWtfb3J5Z2luYWx1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMDQxICU+JSBzZWxlY3QoWkFfVVdBR0ksWkFfSkVaWUtfT1JZR0lOQUxVID0gYCRhYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShaQV9KRVpZS19PUllHSU5BTFUgPSBzdHJfcmVwbGFjZV9hbGwoWkFfSkVaWUtfT1JZR0lOQUxVLCJcXCRhIiwiLCIpKSAlPiUNCiAgdW5pcXVlKCkNCg0KIzY6IHdzcMOzxYJ0d8OzcmN5DQptYXJjX2ZpZWxkXzcwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDcwMCklPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIiguLlxcJGEpIiwifFxcMSIpLA0KICAgICAgICAgWDcwMD1zdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNzAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlbW92ZV9hbGwoWDcwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpICU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDcwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzcwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF83MDA8LWNiaW5kKG1hcmNfZmllbGRfNzAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNzAwJFg3MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF83MDAkWDcwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF83MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF83MDAkWDcwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNzAwJFg3MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gbWFyY19maWVsZF83MDAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvc29iYSA9IGAkYWAsZnVua2NqYSA9IGAkZWApICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGZ1bmtjamEpKSAlPiUNCiAgbXV0YXRlKG9zb2JhID0gc3RyX3JlbW92ZShvc29iYSwiKD88PVthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiKSwNCiAgICAgICAgIE9TX05BWldJU0tPID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwxIiksYXMuY2hhcmFjdGVyKG9zb2JhKSksDQogICAgICAgICBPU19JTUlFID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSwNCiAgICAgICAgIHdzX3Byb3N0eSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIob3NvYmEpLCAiXFxXIiwgIiIpLA0KICAgICAgICAgZnVfcHJvc3RhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihmdW5rY2phKSwgIlxcVyIsICIiKSkgJT4lDQogIGxlZnRfam9pbiguLFBCTF93c3BvbHR3b3JjeSAlPiUgc2VsZWN0KE9TX09TT0JBX0lELE9TX0xJQ1pCQV9aQVBJU09XLG5hendhX3Byb3N0YSksYnk9Yygid3NfcHJvc3R5Ij0ibmF6d2FfcHJvc3RhIikpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLE9TX05BWldJU0tPLE9TX0lNSUUsLU9TX0xJQ1pCQV9aQVBJU09XKQ0KQk5fd3Nwb2x0d29yY2EkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX3dzcG9sdHdvcmNhWzE6Ml0pKQ0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2FbIWR1cGxpY2F0ZWQoQk5fd3Nwb2x0d29yY2EkaWRfZ3J1cHkpLF0gJT4lDQogIGxlZnRfam9pbiguLFBCTF9mdW5rY2plLGJ5PWMoImZ1X3Byb3N0YSI9Im5hendhIikpICU+JQ0KICBtdXRhdGUoZm9fc3ltYm9sID0gaWZlbHNlKGZvX3N5bWJvbD09Ik5VTEwiLE5BLGFzLmNoYXJhY3Rlcihmb19zeW1ib2wpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phKQ0KDQojdHV0YWogcHJ6ZXN6dWthxIcgWDI0NSBpIHpuYWxlxbrEhyBixYLEmWR5IHdzcMOzxYJ0d8OzcmPDs3cNCm1hcmNfZmllbGRfMjQ1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJ+IiksDQogICAgICAgICBYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8yNDUgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1Yz1gJGNgKQ0KDQpCTl93c3BvbHR3b3JjYSA8LSBCTl93c3BvbHR3b3JjYSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8yNDUsYnk9IlpBX1VXQUdJIikNCg0KeCA8LSAxOmxlbmd0aHMoQk5fd3Nwb2x0d29yY2FbMV0pDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBCTl93c3BvbHR3b3JjYSRjenlfbmF6d2lza29baV0gPC0gc3RyX2RldGVjdChCTl93c3BvbHR3b3JjYSRYMjQ1Y1tpXSxCTl93c3BvbHR3b3JjYSRPU19OQVpXSVNLT1tpXSkNCiAgQk5fd3Nwb2x0d29yY2EkY3p5X2ltaWVbaV0gPC0gZ3JlcGwoQk5fd3Nwb2x0d29yY2EkT1NfSU1JRVtpXSxCTl93c3BvbHR3b3JjYSRYMjQ1Y1tpXSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2EgJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBpZmVsc2UoY3p5X25hendpc2tvPT1GQUxTRXxjenlfaW1pZT09RkFMU0UscGFzdGUoIlVXQUdBISBLb25mbGlrdCB3IGRhbnljaCBvc29ib3d5Y2ggdyBwb2xhY2ggNzAwIGkgMjQ1LiBQb3LDs3duYWogcG9sYSB3c3DDs8WCdMOzcmPDs3cgdyBmb3JtdWxhcnp1IHogcG9sZW0gQk46ICIsWDI0NWMsc2VwID0gIiIpLE5BKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phLFpBX0FETk9UQUNKRSkNCg0KIzc6IG9waXMgd3Nww7PFgnR3w7NyY8Ozdw0Kb3Bpc193c3BvbHR3b3Jjb3cgPC0gQk5fd3Nwb2x0d29yY2EgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxmdW5rY2phLE9TX0lNSUUsT1NfTkFaV0lTS08pICU+JQ0KICBmdWxsX2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShPU19OQVpXSVNLTyl8KGlzLm5hKE9TX05BWldJU0tPKSZncmVwbCgiZXQgYWxcXC4iLFgyNDVjKSkpICU+JQ0KICBtdXRhdGUoamVzdF9ldF9hbCA9IGdyZXBsKCJldCBhbFxcLiIsWDI0NWMpLA0KICAgICAgICAgT1NfSU1JRSA9IGlmZWxzZShPU19JTUlFPT0iKiIsIiIsYXMuY2hhcmFjdGVyKE9TX0lNSUUpKSwNCiAgICAgICAgIG9waXMgPSBpZmVsc2UoIWlzLm5hKE9TX05BWldJU0tPKSxwYXN0ZShmdW5rY2phLE9TX0lNSUUsIE9TX05BWldJU0tPLCBzZXAgPSAiICIpLCIiKSwNCiAgICAgICAgIG9waXMgPSBzdHJfcmVwbGFjZV9hbGwob3BpcywiICsiLCIgIiksDQogICAgICAgICBvcGlzID0gaWZlbHNlKG9waXM9PSIgIiwiIixhcy5jaGFyYWN0ZXIob3BpcykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXMsamVzdF9ldF9hbCkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKG9waXMgPSBwYXN0ZShvcGlzLGNvbGxhcHNlID0gIiwgIiksDQogICAgICAgICBqZXN0X2V0X2FsID0gcGFzdGUodW5pcXVlKGplc3RfZXRfYWwpLHNlcCA9ICIiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShvcGlzID0gaWZlbHNlKGplc3RfZXRfYWw9PVRSVUUmb3Bpcz09IiIsImV0IGFsLiIsDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShqZXN0X2V0X2FsLHBhc3RlKG9waXMsImV0IGFsLiIsc2VwID0gIiAiKSxvcGlzKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksb3BpcykNCg0KIzcwMA0KbWFyY19maWVsZF83MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg3MDApJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZXBsYWNlX2FsbChYNzAwLCIoLi5cXCRhKSIsInxcXDEiKSwNCiAgICAgICAgIFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDcwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZW1vdmVfYWxsKFg3MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg3MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF83MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNzAwPC1jYmluZChtYXJjX2ZpZWxkXzcwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzcwMCRYNzAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNzAwJFg3MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNzAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNzAwJFg3MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzcwMCRYNzAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzcwMCA8LSBtYXJjX2ZpZWxkXzcwMCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9zb2JhID0gYCRhYCxmdW5rY2phID0gYCRlYCkgJT4lDQogIGZpbHRlcighaXMubmEoZnVua2NqYSkpICU+JQ0KICBtdXRhdGUob3NvYmEgPSBzdHJfcmVtb3ZlKG9zb2JhLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpLA0KICAgICAgICAgT1NfTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIob3NvYmEpKSwNCiAgICAgICAgIE9TX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDMiKSwiKiIpLA0KICAgICAgICAgZnVua2NqYV9kdXphID0gc3RyX3RvX2xvd2VyKGZ1bmtjamEpLA0KICAgICAgICAgb3BpcyA9IHBhc3RlKGZ1bmtjamFfZHV6YSxPU19JTUlFLE9TX05BWldJU0tPLCBzZXAgPSAiICIpLA0KICAgICAgICAgb3Bpc19kdXp5ID0gcGFzdGUoZnVua2NqYSxPU19JTUlFLE9TX05BWldJU0tPLCBzZXAgPSAiICIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXMsb3Bpc19kdXp5KSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUob3BpcyA9IHBhc3RlKG9waXMsY29sbGFwc2UgPSAiLiAiKSwNCiAgICAgICAgIG9waXNfZHV6eSA9IHBhc3RlKG9waXNfZHV6eSxjb2xsYXBzZSA9ICIuICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKQ0KDQojb3BpcyB3c3DDs8WCdHfDs3Jjw7N3IHplIHN0cmVmeSBvZHBvd2llZHppYWxub8WbY2kgMjQ1DQptYXJjX2ZpZWxkXzI0NSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSklPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwifiIpLA0KICAgICAgICAgWDI0NT1zdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDU8LWNiaW5kKG1hcmNfZmllbGRfMjQ1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ1JFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDUkWDI0NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDUkWDI0NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ1JFgyNDUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMjQ1IDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRjYCkNCg0KI3BvcsOzd25hbmllIG9waXN1IHdzcMOzxYJ0d8OzcmPDs3cgeiAyNDUgaSA3MDANCndzcG9sdHdvcmN5IDwtIG1hcmNfZmllbGRfNzAwICU+JQ0KICBmdWxsX2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgY1NwbGl0KC4sIiRjIixzZXAgPSAiIDsgIixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICAjb2dyYW5pY3phbmllIG9zw7NiIHplIHN0cmVmeSBvZHBvd2llZHppYWxub8WbY2kNCiAgbXV0YXRlKGN6eV9tYWxhID0gZ3JlcGwoIiBbYS16xJnDs8SFxZvFgsW8xbrEh8WEXXxeW2EtesSZw7PEhcWbxYLFvMW6xIfFhF18XFxbW2EtesSZw7PEhcWbxYLFvMW6xIfFhF0iLGAkY2AsaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQ0KICBmaWx0ZXIoY3p5X21hbGE9PVRSVUUpICU+JQ0KICBzZWxlY3QoLWN6eV9tYWxhKSAlPiUNCiAgI211dGF0ZShgJGNgID0gZ3N1YigiXihcXFspezAsMX0oW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSIsIlxcMVxcVVxcMiIscGVybCA9IFRSVUUsYCRjYCkpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShYMjQ1ID0gcGFzdGUoYCRjYCwgY29sbGFwc2UgPSAiLCAiKSkgJT4lDQogIHNlbGVjdCgtYCRjYCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUob3JkZXJfcGJsID0gYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChvcGlzLCIoPzw9XnwgfFxcW3wtKShbQS1aQcOBw4DDgsODw4TEgsSAw4XEhMOGRcOJw4jDisOLxJrEksSWxJhJw43DjMOOw4/EqsSuSU/Dk8OSw5TDlcOWxZDDmMWSVcOaw5nDm8OcxbDFqsWvWcOdQ8SGxIzDp0TEjsSQxJBHxKLEnkvEtkzFgcS7TsWDw5HFh8WFxYpSxZhTxZrFoMWeU8OfVMWkxabDnsWiOFrFu8W5xb1hLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkiKSksDQogICAgICAgICBvcmRlcl9wYmwgPSBzdHJfcmVwbGFjZV9hbGwob3JkZXJfcGJsLCIoLio/XCIpKC4pKFwiLio/LikiLCAiXFwyIiksDQogICAgICAgICBvcmRlcl9ibiA9IGFzLmNoYXJhY3RlcihzdHJfZXh0cmFjdF9hbGwoWDI0NSwiKD88PV58IHxcXFt8LSkoW0EtWkHDgcOAw4LDg8OExILEgMOFxITDhkXDicOIw4rDi8SaxJLElsSYScONw4zDjsOPxKrErklPw5PDksOUw5XDlsWQw5jFklXDmsOZw5vDnMWwxarFr1nDnUPEhsSMw6dExI7EkMSQR8SixJ5LxLZMxYHEu07Fg8ORxYfFhcWKUsWYU8WaxaDFnlPDn1TFpMWmw57FojhaxbvFucW9YS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pIikpLA0KICAgICAgICAgb3JkZXJfYm4gPSBzdHJfcmVwbGFjZV9hbGwob3JkZXJfYm4sIiguKj9cIikoLikoXCIuKj8uKSIsICJcXDIiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsICJcXC4kIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCAiXFxbIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCAiXFxdIiksDQogICAgICAgICBvcmRlcl9wYmwgPSBzdHJfcmVtb3ZlX2FsbChvcmRlcl9wYmwsICJbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iKSwNCiAgICAgICAgIG9yZGVyX2JuID0gc3RyX3JlbW92ZV9hbGwob3JkZXJfYm4sICJbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iKSwNCiAgICAgICAgIHRvX3NhbW8gPSBvcmRlcl9wYmw9PW9yZGVyX2JuLA0KICAgICAgICAgWDI0NSA9IGdzdWIoIiheW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSguKikiLCJcXFVcXDFcXEVcXDIiLHBlcmwgPSBUUlVFLCBYMjQ1KSkgJT4lDQogIGxlZnRfam9pbiguLHphX2plenlrX29yeWdpbmFsdSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKGN6eV9wbCA9IGdyZXBsKCJwb2wiLFpBX0pFWllLX09SWUdJTkFMVSl8aXMubmEoWkFfSkVaWUtfT1JZR0lOQUxVKSwNCiAgICAgICAgIGRlY3l6amEgPSBpZmVsc2UodG9fc2Ftbz09RkFMU0V8Y3p5X3BsPT1GQUxTRSxGQUxTRSxUUlVFKSkNCg0KemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gd3Nwb2x0d29yY3kgJT4lDQogIG11dGF0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IGlmZWxzZShkZWN5emphPT1UUlVFLGFzLmNoYXJhY3RlcihYMjQ1KSxwYXN0ZShYMjQ1LG9waXNfZHV6eSxzZXAgPSAiIyIpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvcGlzX2R1enksemFfb3Bpc193c3BvbHR3b3Jjb3cpICU+JQ0KICBjU3BsaXQoLiwiemFfb3Bpc193c3BvbHR3b3Jjb3ciLHNlcCA9ICIjIixkaXJlY3Rpb24gPSAid2lkZSIpICU+JQ0KICBtdXRhdGUoemFfb3Bpc193c3BvbHR3b3Jjb3dfMiA9IGlmZWxzZShpcy5uYSh6YV9vcGlzX3dzcG9sdHdvcmNvd18yKSwnJyxhcy5jaGFyYWN0ZXIoemFfb3Bpc193c3BvbHR3b3Jjb3dfMikpLA0KICAgICAgICAgdG9fc2FtbyA9IHphX29waXNfd3Nwb2x0d29yY293XzE9PXphX29waXNfd3Nwb2x0d29yY293XzIpICU+JQ0KICBmaWx0ZXIodG9fc2Ftbz09RkFMU0UpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IHBhc3RlKHphX29waXNfd3Nwb2x0d29yY293XzEsemFfb3Bpc193c3BvbHR3b3Jjb3dfMixzZXAgPSAiIyIpLA0KICAgICAgICAgemFfb3Bpc193c3BvbHR3b3Jjb3cgPSBzdHJfcmVtb3ZlX2FsbCh6YV9vcGlzX3dzcG9sdHdvcmNvdywiXFwjJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHphX29waXNfd3Nwb2x0d29yY293KQ0KDQpvcGlzX3dzcG9sdHdvcmNvdyA8LSBvcGlzX3dzcG9sdHdvcmNvdyAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgemFfb3Bpc193c3BvbHR3b3Jjb3ckWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKG9waXMpKSAlPiUNCiAgcmVuYW1lKHphX29waXNfd3Nwb2x0d29yY293ID0gb3BpcykNCg0KemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gemFfb3Bpc193c3BvbHR3b3Jjb3cgJT4lDQogIGJpbmRfcm93cyguLG9waXNfd3Nwb2x0d29yY293KSAlPiUNCiAgcmlnaHRfam9pbiguLGRhdGEgJT4lIHNlbGVjdChaQV9VV0FHSSksYnk9IlpBX1VXQUdJIikNCg0KIzggd3lkYW5pZQ0KbWFyY19maWVsZF8yNTAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNTApJT4lDQogIGZpbHRlcihYMjUwIT0iIikgJT4lDQogIG11dGF0ZShYMjUwPXN0cl9yZXBsYWNlX2FsbChYMjUwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNTAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDI1MD1zdHJfcmVtb3ZlX2FsbChYMjUwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNTAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjUwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjUwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI1MDwtY2JpbmQobWFyY19maWVsZF8yNTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNTAkWDI1MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI1MCRYMjUwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI1MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI1MCRYMjUwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNTAkWDI1MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQp6YV93eWRhbmllIDwtIG1hcmNfZmllbGRfMjUwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIHd5ZGFuaWUgPSBgJGFgKSAlPiUNCiAgbXV0YXRlKHd5ZGFuaWUgPSBzdHJfcmVtb3ZlKHd5ZGFuaWUsIiBcXC8kIikpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojOTogaW5zdHl0dWNqYSBzcHJhd2N6YQ0KbWFyY19maWVsZF8yNDUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIn4iKSwNCiAgICAgICAgIFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ1PC1jYmluZChtYXJjX2ZpZWxkXzI0NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NSRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ1JFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ1JFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NSRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCnphX2luc3R5dHVjamEgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1Yz1gJGNgKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShYMjQ1YykpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IGlmZWxzZShncmVwbCgiXFw7IixYMjQ1Yyksc3RyX3JlcGxhY2VfYWxsKFgyNDVjLCAiKC4qPykoXFw7KD8hLipcXDspKSggKSsoLio/JCkiLCJcXDQiKSwiIikpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSxieT0iWkFfVVdBR0kiKQ0KDQp4IDwtIDE6bGVuZ3Rocyh6YV9pbnN0eXR1Y2phWzFdKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgemFfaW5zdHl0dWNqYSRjenlfbmF6d2lza29baV0gPC0gZ3JlcGwoemFfaW5zdHl0dWNqYSRPU19OQVpXSVNLT1tpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KICB6YV9pbnN0eXR1Y2phJGN6eV9pbWllW2ldIDwtIGdyZXBsKHphX2luc3R5dHVjamEkT1NfSU1JRVtpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KfQ0KDQp6YV9pbnN0eXR1Y2phIDwtIHphX2luc3R5dHVjamEgJT4lDQogIGZpbHRlcihpcy5uYShjenlfbmF6d2lza28pJmlzLm5hKGN6eV9pbWllKSkgJT4lDQogIGZpbHRlcihpbnN0eXR1Y2phIT0iIikgJT4lDQogIGZpbHRlcighZ3JlcGwoIl5cXFtbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl18XlthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSIsaW5zdHl0dWNqYSkpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IHN0cl9yZW1vdmUoaW5zdHl0dWNqYSwiXFwuJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGluc3R5dHVjamEpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMTA6IHd5ZGF3bmljdHdvDQpCTl93eWRhd25pY3R3byA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIFgyNjApICU+JQ0KICBtdXRhdGUoWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwublxcLiIsICJiLncuIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJTXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZW1vdmUoWDI2MCwiXlxcXFwrIiksIA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfZXh0cmFjdF9hbGwoWDI2MCwgIig/PD1cXCRjKS4qKD89XFwkZSl8KD88PVxcJGMpLioiKSwgDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCAiLlxcJGMuKiIsICIiKSwgDQogICAgICAgICBpbGVfd3lkYXduaWN0dyA9IHN0cl9jb3VudChiZXpfcm9rdSwgIlxcJGIiKSwNCiAgICAgICAgIGlsZV9taWVqc2MgPSBzdHJfY291bnQoYmV6X3Jva3UsICJcXCRhIiksDQogICAgICAgICBrb2xlam5vc2MgPSBzdHJfcmVwbGFjZV9hbGwoYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChiZXpfcm9rdSwgIlxcJC4iKSksICJbXmEtel0iLCAiIiksDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChiZXpfcm9rdSwgIjtcXCRiIiwgIjokYiIpLA0KICAgICAgICAgd3lkYXdfcG9kemllbCA9IGlmZWxzZShpbGVfd3lkYXduaWN0dz5pbGVfbWllanNjfGtvbGVqbm9zYz09ImNhYWJiIiwgc3RyX3JlcGxhY2VfYWxsKGJlel9yb2t1LCAiKFxcJGEpKC4qPykoIDpcXCRiLio/KSggOlxcJGIpIiwgIlxcMVxcMlxcMyA7JGFcXDJcXDQiKSxiZXpfcm9rdSksDQogICAgICAgICB3eWRhd25pY3R3b190ZXN0ID0gc3RyX3JlcGxhY2VfYWxsKHd5ZGF3X3BvZHppZWwsICIoXFwkYikoLio/KSggO1xcJGEpIiwgIlxcMVxcMnxcXDMiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxyb2tfd3lkYW5pYSx3eWRhd25pY3R3b190ZXN0KSAlPiUNCiAgY1NwbGl0KC4sICJ3eWRhd25pY3R3b190ZXN0Iiwgc2VwID0gInwiLCBkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBtdXRhdGUod3lkYXduaWN0d28gPSBzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRiKSguKikiKSwNCiAgICAgICAgIG1pZWpzY2Vfd3lkYW5pYSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRhKSguKikoPz0gezAsMX06IHswLDF9XFwkYil8KD88PVxcJGEpKC4qKSgkKSIpLCIgO1xcJGEiLCAiLCAiKSwNCiAgICAgICAgIG5hendhX3Byb3N0YSA9IHN0cl90b19sb3dlcihzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKHVubGlzdCh3eWRhd25pY3R3b190ZXN0KSwgIlxcJFxcdyIsICIiKSwgIlxcVyIsICIiKSkpICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfd3lkYXduaWN0d2EsYnk9Im5hendhX3Byb3N0YSIpICU+JQ0KICBtdXRhdGUodG9fc2FtbyA9IHd5ZGF3bmljdHdvPT1XWV9OQVpXQSkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLXRvX3NhbW8sLVdZX0xJQ1pCQV9aQVBJU09XKQ0KQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX3d5ZGF3bmljdHdvWzE6M10pKQ0KQk5fd3lkYXduaWN0d28gPC0gQk5fd3lkYXduaWN0d29bIWR1cGxpY2F0ZWQoQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkpLF0gJT4lDQogIG11dGF0ZShXWV9OQVpXQSA9IGlmZWxzZSghaXMubmEoV1lfTkFaV0EpLGFzLmNoYXJhY3RlcihXWV9OQVpXQSksYXMuY2hhcmFjdGVyKHd5ZGF3bmljdHdvKSksDQogICAgICAgICBXWV9NSUFTVE8gPSBpZmVsc2UoIWlzLm5hKFdZX01JQVNUTyksYXMuY2hhcmFjdGVyKFdZX01JQVNUTyksYXMuY2hhcmFjdGVyKG1pZWpzY2Vfd3lkYW5pYSkpLA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfcmVwbGFjZV9hbGwocm9rX3d5ZGFuaWEsICIoLiopKFxcLikiLCAiXFwxIiksDQogICAgICAgICB6YV9yb2tfd3lkYW5pYSA9IGlmZWxzZShuY2hhcihyb2tfd3lkYW5pYSk9PTQsYXMuY2hhcmFjdGVyKHJva193eWRhbmlhKSxOQSksDQogICAgICAgICBkb19vcGlzdSA9IGlmZWxzZShpcy5uYSh6YV9yb2tfd3lkYW5pYSkscGFzdGUoIlsiLHN0cl9leHRyYWN0KHJva193eWRhbmlhLCJcXGR7NH0iKSwiXSIsc2VwID0gIiIpLCIiKSwNCiAgICAgICAgIFdZX01JQVNUTyA9IGlmZWxzZShzdWJzdHIoV1lfTUlBU1RPLDEsMSk9PSJbIiZzdWJzdHIoV1lfTUlBU1RPLG5jaGFyKFdZX01JQVNUTyksbmNoYXIoV1lfTUlBU1RPKSkhPSJdIiZpcy5uYShXWV9XWURBV05JQ1RXT19JRCkscGFzdGUodHJpbShXWV9NSUFTVE8pLCJdIixzZXAgPSAiIiksYXMuY2hhcmFjdGVyKFdZX01JQVNUTykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFdZX1dZREFXTklDVFdPX0lELFdZX05BWldBLFdZX01JQVNUTyx6YV9yb2tfd3lkYW5pYSxkb19vcGlzdSkNCg0KIzExOiBvcGlzIGZpenljem55IGtzacSFxbxraQ0KI3BvbGUgMzAwIGRvIG9waXN1IGZpenljem5lZ28NCm1hcmNfZmllbGRfMzAwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMzAwKSU+JQ0KICBmaWx0ZXIoWDMwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDMwMD1zdHJfcmVwbGFjZV9hbGwoWDMwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMzAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgzMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgzMDA9c3RyX3JlbW92ZV9hbGwoWDMwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMzAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDMwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzMwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8zMDA8LWNiaW5kKG1hcmNfZmllbGRfMzAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMzAwJFgzMDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8zMDAkWDMwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8zMDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8zMDAkWDMwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMzAwJFgzMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMzAwIDwtIG1hcmNfZmllbGRfMzAwICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpLA0KICAgICAgICAgYCRiYCA9IHN0cl9yZW1vdmUoYCRiYCwiIFxcOyskfCBcXDorJCIpLA0KICAgICAgICAgYCRlYCA9IGlmZWxzZShncmVwbCgiQ0QtUk9NfERWRHxWQ0R8Q0QiLGAkZWApJmdyZXBsKCJcXCsgZHlza3xwxYJ5dCIsYCRlYCksc3RyX2V4dHJhY3QoYCRlYCwiKD88PVxcKykoZHlza3xwxYJ5dC4qPykoQ0QtUk9NfERWRHxWQ0R8Q0QpKFxcKSl7MCwxfSIpLA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIkNELVJPTXxEVkR8VkNEfENEIixgJGVgKSxzdHJfZXh0cmFjdChgJGVgLCIoXi4qPykoQ0QtUk9NfERWRHxWQ0R8Q0QpKFxcKSl7MCwxfSIpLE5BKSksDQogICAgICAgICBgJGFgID0gaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksDQogICAgICAgICBgJGJgID0gaWZlbHNlKGlzLm5hKGAkYmApLCIiLGFzLmNoYXJhY3RlcihgJGJgKSksDQogICAgICAgICBgJGVgID0gaWZlbHNlKGlzLm5hKGAkZWApLCIiLGFzLmNoYXJhY3RlcihgJGVgKSkpDQojcG9sZSA1MDAgZG8gb3Bpc3UgZml6eWN6bmVnbw0KbWFyY19maWVsZF81MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg1MDApJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZXBsYWNlX2FsbChYNTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg1MDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDUwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMD1zdHJfcmVtb3ZlX2FsbChYNTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg1MDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzUwMDwtY2JpbmQobWFyY19maWVsZF81MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF81MDAkWDUwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzUwMCRYNTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzUwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzUwMCRYNTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF81MDAkWDUwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF81MDAgPC0gbWFyY19maWVsZF81MDAgJT4lDQogIG11dGF0ZShgJGFgID0gaWZlbHNlKGdyZXBsKCJvcnlnKFxcLnxcXCwpIixYNTAwKSZncmVwbCgicHNldWR8bmF6d2EiLFg1MDAsaWdub3JlLmNhc2UgPSBUUlVFKSxzdHJfcmVwbGFjZShgJGFgLCIoXi4qPykoXFwuICkoXFxwe0x1fS4qJCkiLCJcXDMiKSxhcy5jaGFyYWN0ZXIoYCRhYCkpKSAlPiUgDQogIGZpbHRlcighZ3JlcGwoIm9yeWcoXFwufFxcLCkiLGAkYWApJmdyZXBsKCJwc2V1ZHxuYXp3YXxkb3R5Y3p8cG9sIixgJGFgLGlnbm9yZS5jYXNlID0gVFJVRSkpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpKQ0KICANCiNwb2xlIDU0NiBkbyBvcGlzdSBmaXp5Y3puZWdvDQptYXJjX2ZpZWxkXzU0NiA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDU0NiklPiUNCiAgZmlsdGVyKFg1NDYhPSIiKSAlPiUNCiAgbXV0YXRlKFg1NDY9c3RyX3JlcGxhY2VfYWxsKFg1NDYsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDU0NiIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTQ2IT0iIikgJT4lDQogIG11dGF0ZShYNTQ2PXN0cl9yZW1vdmVfYWxsKFg1NDYsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDU0NiwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1NDYsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81NDYpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTQ2PC1jYmluZChtYXJjX2ZpZWxkXzU0NixlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzU0NiRYNTQ2IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTQ2JFg1NDYsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTQ2WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTQ2JFg1NDYpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzU0NiRYNTQ2KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzU0NiA8LSBtYXJjX2ZpZWxkXzU0NiAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSkNCg0KemFfb3Bpc19rcyA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93eWRhd25pY3R3byAlPiUgc2VsZWN0KFpBX1VXQUdJLGRvX29waXN1KSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8zMDAgJT4lIHNlbGVjdChaQV9VV0FHSSxYMzAwYT1gJGFgLFgzMDBiPWAkYmAsWDMwMGU9YCRlYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTAwICU+JSBzZWxlY3QoWkFfVVdBR0ksWDUwMGE9YCRhYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTQ2ICU+JSBzZWxlY3QoWkFfVVdBR0ksWDU0NmE9YCRhYCksYnk9IlpBX1VXQUdJIikNCnphX29waXNfa3NbaXMubmEoemFfb3Bpc19rcyldICA8LSAiIg0KemFfb3Bpc19rcyA8LSB6YV9vcGlzX2tzICU+JQ0KICBtdXRhdGUoemFfb3Bpc19rcyA9IHBhc3RlKGlmZWxzZShkb19vcGlzdSE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKGRvX29waXN1KSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFgzMDBhIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDMwMGEpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDMwMGIhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYMzAwYiksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYMzAwZSE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKFgzMDBlKSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFg1MDBhIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDUwMGEpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDU0NmEhPSIiLGFzLmNoYXJhY3RlcihYNTQ2YSksIiIpLHNlcCA9ICIiKSwNCiAgICAgICAgIHphX29waXNfa3MgPSBzdHJfcmVtb3ZlKHphX29waXNfa3MsIigsICkrJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHphX29waXNfa3MpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSwtbmNoYXIoemFfb3Bpc19rcykpDQp6YV9vcGlzX2tzJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZCh6YV9vcGlzX2tzWzFdKSkNCnphX29waXNfa3MgPC0gemFfb3Bpc19rc1shZHVwbGljYXRlZCh6YV9vcGlzX2tzJGlkX2dydXB5KSxdICU+JQ0KICBzZWxlY3QoLWlkX2dydXB5KQ0KDQojMTI6IHNlcmlhIHd5ZGF3bmljemENCm1hcmNfZmllbGRfNDkwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNDkwLFg4MDAsWDgzMCkgJT4lDQogIG11dGF0ZShYNDkwID0gaWZlbHNlKGdyZXBsKCJVXFwrIixYNDkwKSxhcy5jaGFyYWN0ZXIoWDgzMCksYXMuY2hhcmFjdGVyKFg0OTApKSkgJT4lDQogIG11dGF0ZShYODAwID0gaWZlbHNlKFg0OTAhPSIiLCIiLGFzLmNoYXJhY3RlcihYODAwKSksDQogICAgICAgICBYODMwID0gaWZlbHNlKFg0OTAhPSIiLCIiLGFzLmNoYXJhY3RlcihYODMwKSksDQogICAgICAgICBYODAwID0gc3RyX3JlcGxhY2UoWDgwMCwiKFxcJGEpKC4qKShcXCR0KSIsIlxcMSIpLA0KICAgICAgICAgWDQ5MCA9IGlmZWxzZShYNDkwPT0iIiZYODMwIT0iIixhcy5jaGFyYWN0ZXIoWDgzMCksDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShYNDkwPT0iIiZYODAwIT0iIixhcy5jaGFyYWN0ZXIoWDgwMCksYXMuY2hhcmFjdGVyKFg0OTApKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDQ5MCkgJT4lDQogIGZpbHRlcihYNDkwIT0iIikgJT4lDQogIG11dGF0ZShYNDkwPXN0cl9yZXBsYWNlX2FsbChYNDkwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg0OTAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDQ5MCE9IiIpICU+JQ0KICBtdXRhdGUoWDQ5MD1zdHJfcmVtb3ZlX2FsbChYNDkwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg0OTAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNDkwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNDkwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzQ5MDwtY2JpbmQobWFyY19maWVsZF80OTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF80OTAkWDQ5MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzQ5MCRYNDkwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzQ5MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzQ5MCRYNDkwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF80OTAkWDQ5MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KemFfc2VyaWFfd3lkYXduaWN6YSA8LSBtYXJjX2ZpZWxkXzQ5MCAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKD0pKFxcJGEpIiwiXFwxICIpLA0KICAgICAgICAgYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpLA0KICAgICAgICAgYCR2YCA9IGlmZWxzZShpcy5uYShgJHZgKSwiIixhcy5jaGFyYWN0ZXIoYCR2YCkpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShgJGFgKSkgJT4lDQogIG11dGF0ZShzZXJpYSA9IHN0cl9yZW1vdmUocGFzdGUoIigiLGAkYWAsIjsgIixgJHZgLCIpIixzZXAgPSAiIiksIjsgKD89XFwpJCkiKSwNCiAgICAgICAgIHNlcmlhID0gZ3N1YigiKCA6ICkoLikiLCIuIFxcVVxcMiIscGVybD1UUlVFLHNlcmlhKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxzZXJpYSkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKHNlcmlhID0gcGFzdGUoc2VyaWEsY29sbGFwc2UgPSAiICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKHNlcmlhID0gc3RyX3JlcGxhY2VfYWxsKHNlcmlhLCJcXCQuIiwiOyAiKSkgJT4lDQogIHJpZ2h0X2pvaW4oLixkYXRhICU+JSBzZWxlY3QoWkFfVVdBR0kpLGJ5PSJaQV9VV0FHSSIpDQoNCiMxMzogdG9teQ0KemFfdG9teSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoemFfdG9teSA9IE5BKQ0KDQojMTQ6IGFkbm90YWNqZQ0KemFfYWRub3RhY2plIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX2F1dG9yICU+JSBzZWxlY3QoWkFfVVdBR0ksWkFfQUROT1RBQ0pFKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3Nwb2x0d29yY2EgJT4lIHNlbGVjdChaQV9VV0FHSSxaQV9BRE5PVEFDSkUpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBtdXRhdGUoWkFfQUROT1RBQ0pFID0gcGFzdGUoaWZlbHNlKGlzLm5hKFpBX0FETk9UQUNKRS54KSwiIixwYXN0ZShhcy5jaGFyYWN0ZXIoWkFfQUROT1RBQ0pFLngpLCIjICIsc2VwID0gIiIpKSxpZmVsc2UoaXMubmEoWkFfQUROT1RBQ0pFLnkpLCIiLGFzLmNoYXJhY3RlcihaQV9BRE5PVEFDSkUueSkpLHNlcCA9ICIiKSwNCiAgICAgICAgIFpBX0FETk9UQUNKRSA9IHN0cl9yZW1vdmUoWkFfQUROT1RBQ0pFLCIoIyApKyQiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxaQV9BRE5PVEFDSkUpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSwtbmNoYXIoWkFfQUROT1RBQ0pFKSkNCnphX2Fkbm90YWNqZSRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoemFfYWRub3RhY2plWzFdKSkNCnphX2Fkbm90YWNqZSA8LSB6YV9hZG5vdGFjamVbIWR1cGxpY2F0ZWQoemFfYWRub3RhY2plJGlkX2dydXB5KSxdICU+JQ0KICBzZWxlY3QoLWlkX2dydXB5KQ0KDQojMTU6IEJOX1VSTA0KQk5fVVJMIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxCTl9VUkwpDQoNCiN3eXLDs3duYW5pZSBsaWN6Ynkgd2llcnN6eSBkbyBsaWN6Ynkgd2llcnN6eSBvYmlla3R1IGRhdGENCkJOX2F1dG9yIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX2F1dG9yICU+JSBzZWxlY3QoWkFfVVdBR0ksQU1fQVVUT1JfSUQsQU1fTkFaV0lTS08sQU1fSU1JRSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGRkcGx5KC4sIC4oWkFfVVdBR0kpLCBzdW1tYXJpemUsIEFNX0FVVE9SX0lEID0gcGFzdGUoQU1fQVVUT1JfSUQsIGNvbGxhcHNlPSJ8IiksIEFNX05BWldJU0tPID0gcGFzdGUoQU1fTkFaV0lTS08sIGNvbGxhcHNlPSJ8IiksIEFNX0lNSUUgPSBwYXN0ZShBTV9JTUlFLCBjb2xsYXBzZT0ifCIpKQ0KQk5fd3Nwb2x0d29yY2EgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3Nwb2x0d29yY2EgJT4lIHNlbGVjdChaQV9VV0FHSSxPU19PU09CQV9JRCxPU19OQVpXSVNLTyxPU19JTUlFLGZvX3N5bWJvbCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGRkcGx5KC4sIC4oWkFfVVdBR0kpLCBzdW1tYXJpemUsIE9TX09TT0JBX0lEID0gcGFzdGUoT1NfT1NPQkFfSUQsIGNvbGxhcHNlPSJ8IiksIE9TX05BWldJU0tPID0gcGFzdGUoT1NfTkFaV0lTS08sIGNvbGxhcHNlPSJ8IiksIE9TX0lNSUUgPSBwYXN0ZShPU19JTUlFLCBjb2xsYXBzZT0ifCIpLCBmb19zeW1ib2wgPSBwYXN0ZShmb19zeW1ib2wsIGNvbGxhcHNlPSJ8IikpICU+JQ0KICBtdXRhdGUoZm9fc3ltYm9sID0gaWZlbHNlKGZvX3N5bWJvbD09Ik5VTEwiLCJOQSIsYXMuY2hhcmFjdGVyKGZvX3N5bWJvbCkpKQ0KQk5fd3lkYXduaWN0d28gPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3lkYXduaWN0d28gJT4lIHNlbGVjdChaQV9VV0FHSSxXWV9XWURBV05JQ1RXT19JRCxXWV9OQVpXQSxXWV9NSUFTVE8semFfcm9rX3d5ZGFuaWEpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBkZHBseSguLCAuKFpBX1VXQUdJKSwgc3VtbWFyaXplLCBXWV9XWURBV05JQ1RXT19JRCA9IHBhc3RlKFdZX1dZREFXTklDVFdPX0lELCBjb2xsYXBzZT0ifCIpLCBXWV9OQVpXQSA9IHBhc3RlKFdZX05BWldBLCBjb2xsYXBzZT0ifCIpLCBXWV9NSUFTVE8gPSBwYXN0ZShXWV9NSUFTVE8sIGNvbGxhcHNlPSJ8IiksIHphX3Jva193eWRhbmlhID0gcGFzdGUodW5pcXVlKHphX3Jva193eWRhbmlhKSwgY29sbGFwc2U9InwiKSkgJT4lDQogIG11dGF0ZSh6YV9yb2tfd3lkYW5pYSA9IGlmZWxzZSh6YV9yb2tfd3lkYW5pYT09Ik5BIiwiIixhcy5pbnRlZ2VyKHphX3Jva193eWRhbmlhKSkpDQoNCiNwb8WCxIVjemVuaWUgd3N6eXN0a2ljaCBlbGVtZW50w7N3IHcgamVkbsSFIHRhYmVsxJkNCmtvbGVqbm9zYyA8LSBkYXRhLmZyYW1lKGtvbGVqbm9zYz1jKCJaQV9VV0FHSSIsIlJaX05BWldBIiwiWkFfUk9fUk9LIiwiWkFfVFlQRSIsIlJaX1JPRFpBSl9JRCIsIkRaX05BWldBIiwiRFpfRFpJQUxfSUQiLCJUV19UV09SQ0FfSUQiLCJBTV9BVVRPUl9JRCIsIkFNX05BWldJU0tPIiwiQU1fSU1JRSIsIlpBX1RZVFVMIiwiWkFfVFlUVUxfT1JZR0lOQUxVIiwiWkFfSkVaWUtfT1JZR0lOQUxVIiwiT1NfT1NPQkFfSUQiLCJPU19OQVpXSVNLTyIsIk9TX0lNSUUiLCJmb19zeW1ib2wiLCJ6YV9vcGlzX3dzcG9sdHdvcmNvdyIsInd5ZGFuaWUiLCJ6YV90b215IiwiaW5zdHl0dWNqYSIsIldZX1dZREFXTklDVFdPX0lEIiwiV1lfTUlBU1RPIiwiV1lfTkFaV0EiLCJ6YV9yb2tfd3lkYW5pYSIsInphX29waXNfa3MiLCJzZXJpYSIsIlRXX05BWldJU0tPIiwiVFdfSU1JRSIsInJlZGFrdG9yX2R6aWFsdSIsIlpBX0FETk9UQUNKRSIsIkJOX1VSTCIpKQ0KcG9sYWN6b25lIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLHBvbGFfcGJsLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX2F1dG9yLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3R5dHVsLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3R5dHVsX29yeWdpbmFsdSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9qZXp5a19vcnlnaW5hbHUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3Nwb2x0d29yY2EsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfb3Bpc193c3BvbHR3b3Jjb3csYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfd3lkYW5pZSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9pbnN0eXR1Y2phLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX3d5ZGF3bmljdHdvLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX29waXNfa3MsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfc2VyaWFfd3lkYXduaWN6YSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV90b215LGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX2Fkbm90YWNqZSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9VUkwsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgc2VsZWN0KGFzLnZlY3Rvcihrb2xlam5vc2Mka29sZWpub3NjKSkNCmNvbG5hbWVzKHBvbGFjem9uZSkgPC0gYygicmVrb3JkX0JOIiwicnpfbmF6d2EiLCJ6YV9yb19yb2siLCJ6YV90eXBlIiwicnpfcm9kemFqX2lkIiwiRFpfTkFaV0EiLCJEWl9EWklBTF9JRCIsInR3X3R3b3JjYV9pZCIsImFtX2F1dG9yX2lkIiwiYW1fbmF6d2lza28iLCJhbV9pbWllIiwiemFfdHl0dWwiLCJ6YV90eXR1bF9vcnlnaW5hbHUiLCJ6YV9qZXp5a19vcnlnaW5hbHUiLCJvc19vc29iYV9pZCIsIm9zX25hendpc2tvIiwib3NfaW1pZSIsImZvX3N5bWJvbCIsInphX29waXNfd3Nwb2x0d29yY293IiwiemFfd3lkYW5pZSIsInphX3RvbXkiLCJ6YV9pbnN0eXR1Y2phIiwid3lfd3lkYXduaWN0d29faWQiLCJ3eV9taWVqc2NlIiwid3lfbmF6d2EiLCJ6YV9yb2tfd3lkYW5pYSIsInphX29waXNfZml6eWN6bnlfa3NpYXpraSIsInphX3NlcmlhX3d5ZGF3bmljemEiLCJ0d19uYXp3aXNrbyIsInR3X2ltaWUiLCJwcmFjb3duaWsiLCJ6YV9hZG5vdGFjamUiLCJCTl9VUkwiKQ0KDQojemFzeWduYWxpem93YW5pZSBuaWVwb3ByYXduZWdvIGtvZG93YW5pYQ0KeCA8LSAxOihsZW5ndGgocG9sYWN6b25lKS0yKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiPFVcXCsoLi4uLik+Iixwb2xhY3pvbmVbLGldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5jaGFyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpIT0wLHBhc3RlKHBvbGFjem9uZSR6YV9hZG5vdGFjamUscGFzdGUoIlVXQUdBISBCxYLEhWQga29kb3dhbmlhIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIFpuYWpkxbogZnJhesSZIFwiPz8/XCIgaSB6cmVkYWd1aiBwb2xlLiIsc2VwID0gIiIpLHNlcCA9ICIjICIpLHBhc3RlKCJVV0FHQSEgQsWCxIVkIGtvZG93YW5pYSB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiBabmFqZMW6IGZyYXrEmSBcIj8/P1wiIGkgenJlZGFndWogcG9sZS4iLHNlcCA9ICIiKSksYXMuY2hhcmFjdGVyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpKQ0KICBwb2xhY3pvbmVbLGldIDwtIGdzdWIoIjxVXFwrKC4uLi4pPiIsICI/Pz8iLCBwb2xhY3pvbmVbLGldKQ0KfQ0KI3phc3lnbmFsaXpvd2FuaWUgb2JlY25vxZtjaSB6bmFrdSAkIHcga3TDs3J5bcWbIHogcMOzbA0KWCA8LSAxOihsZW5ndGgocG9sYWN6b25lKS0yKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiXFwkIixwb2xhY3pvbmVbLGldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5jaGFyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpPT0wLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gem5hayBcIiRcIi4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHBhc3RlKHBvbGFjem9uZSR6YV9hZG5vdGFjamUscGFzdGUoIlVXQUdBISBaZSB3emdsxJlkdSBuYSBixYLEmWRueSB6YXBpcyBCTiB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiB3eWRydWtvd2FubyB6bmFrIFwiJFwiLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksc2VwID0gIiMgIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCn0NCiN6YXN5Z25hbGl6b3dhbmllIG9iZWNub8WbY2kgZnJhenkgImNoYXJhY3RlcigwKSIgdyBrdMOzcnltxZsgeiBww7NsDQpYIDwtIDE6KGxlbmd0aChwb2xhY3pvbmUpLTIpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIHBvbGFjem9uZSR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGdyZXBsKCJjaGFyYWN0ZXJcXCgwXFwpIixwb2xhY3pvbmVbLGldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5jaGFyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpPT0wLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gZnJhesSZIFwiY2hhcmFjdGVyKDApXCIuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gZnJhesSZIFwiY2hhcmFjdGVyKDApXCIuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxzZXAgPSAiIyAiKSksYXMuY2hhcmFjdGVyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpKQ0KfQ0KI3phc3lnbmFsaXpvd2FuaWUgb2JlY25vxZtjaSB6bmFrdSAjIHcgb3Bpc2llIHdzcMOzxYJ0d8OzcmPDs3cNCnBvbGFjem9uZSR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGdyZXBsKCJcXCMiLHBvbGFjem9uZSR6YV9vcGlzX3dzcG9sdHdvcmNvdyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKT09MCwiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGtvbmZsaWt0IHcgb3Bpc2llIHdzcMOzxYJ0d8OzcmPDs3cgd3liaWVyeiB3xYJhxZtjaXfEhSB3YXJ0b8WbxIcgKHN0cmVmYSBvZHBvd2llZHppYWxub8WbY2kgXCIjXCIgd3Nww7PFgnR3w7NyY3kgeiBwb2xhIDcwMCkuIixwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEga29uZmxpa3QgdyBvcGlzaWUgd3Nww7PFgnR3w7NyY8OzdyB3eWJpZXJ6IHfFgmHFm2Npd8SFIHdhcnRvxZvEhyAoc3RyZWZhIG9kcG93aWVkemlhbG5vxZtjaSAjIHdzcMOzxYJ0d8OzcmN5IHogcG9sYSA3MDApLiIsc2VwID0gIiMgIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCiNrb3Jla3RhIGF1dG9tYXR5Y3puZWdvIElPSw0KYXV0b21hdHljem55X0lPSyA8LSBwb2xhY3pvbmUgJT4lDQogIG11dGF0ZShjenlfdHl0X29yeWcgPSAoIWdyZXBsKCJwb2xzayIsRFpfTkFaV0EpJiFpcy5uYSh6YV90eXR1bF9vcnlnaW5hbHUpKXxncmVwbCgicG9sc2siLERaX05BWldBKSkgJT4lDQogIGZpbHRlcih6YV9hZG5vdGFjamU9PSIiJmFtX25hendpc2tvIT0iTkEiJiFncmVwbCgicHNldWR8bmF6dyIsemFfb3Bpc19maXp5Y3pueV9rc2lhemtpKSYhZ3JlcGwoIlxcfCIsYW1fbmF6d2lza28pJmN6eV90eXRfb3J5Zz09VFJVRSwNCiAgICAgICAgICFncmVwbCgic3praWN8ZmVsaWV0b258bGlzdCIsc3RyX3JlcGxhY2UoemFfdHl0dWwsIiguKikoXFxbLiokKSIsIlxcMiIpLGlnbm9yZS5jYXNlID0gVFJVRSkpICU+JQ0KICBzZWxlY3QocmVrb3JkX0JOKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGZpbHRlcihyZWtvcmRfQk4gJW5vdGluJSBkYXRhJFpBX1VXQUdJW2RhdGEkY3p5X2F1dG9tYXR5Y3puaWU9PSJuaWUiXSkgJT4lDQogIG11dGF0ZShwb3dpbm5vX2J5YyA9ICJJT0siKQ0KI2FrdHVhbGl6YWNqYSAtIHdwaXN6IHfFgmHFm2Npd3kgcm9rIHcgxZtjaWXFvGvEmSBwbGlrdQ0Kd3JpdGUuY3N2MihhdXRvbWF0eWN6bnlfSU9LLCAiQzovVXNlcnMvQ2V6YXJ5L0Rlc2t0b3AvaW1wXzIwMTFfYXV0b21hdHljem5lX3BvZG1pb3Rvd2UuY3N2Iiwgcm93Lm5hbWVzID0gRiwgbmEgPSAnJywgZmlsZUVuY29kaW5nID0gJ1VURi04JykNCg0Kb3V0IDwtIGNTcGxpdChwb2xhY3pvbmUsIGMoImFtX2F1dG9yX2lkIiwgImFtX25hendpc2tvIiwgImFtX2ltaWUiLCJvc19vc29iYV9pZCIsIm9zX25hendpc2tvIiwgIm9zX2ltaWUiLCAiZm9fc3ltYm9sIiwid3lfd3lkYXduaWN0d29faWQiLCJ3eV9taWVqc2NlIiwid3lfbmF6d2EiKSxzZXAgPSAifCIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgdW5pcXVlKCkNCg0Kb3V0JHJla29yZF9CTiA8LSBpZmVsc2UoaXMubmEob3V0JHJla29yZF9CTiksJycsYXMuY2hhcmFjdGVyKG91dCRyZWtvcmRfQk4pKQ0Kb3V0JHJ6X25hendhIDwtIGlmZWxzZShpcy5uYShvdXQkcnpfbmF6d2EpLCcnLGFzLmNoYXJhY3RlcihvdXQkcnpfbmF6d2EpKQ0Kb3V0JHphX3JvX3JvayA8LSBpZmVsc2UoaXMubmEob3V0JHphX3JvX3JvayksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9yb19yb2spKQ0Kb3V0JHphX3R5cGUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90eXBlKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3R5cGUpKQ0Kb3V0JHJ6X3JvZHphal9pZCA8LSBpZmVsc2UoaXMubmEob3V0JHJ6X3JvZHphal9pZCksJycsYXMuY2hhcmFjdGVyKG91dCRyel9yb2R6YWpfaWQpKQ0Kb3V0JERaX05BWldBIDwtIGlmZWxzZShpcy5uYShvdXQkRFpfTkFaV0EpLCcnLGFzLmNoYXJhY3RlcihvdXQkRFpfTkFaV0EpKQ0Kb3V0JERaX0RaSUFMX0lEIDwtIGlmZWxzZShpcy5uYShvdXQkRFpfRFpJQUxfSUQpLCcnLGFzLmNoYXJhY3RlcihvdXQkRFpfRFpJQUxfSUQpKQ0Kb3V0JHR3X3R3b3JjYV9pZCA8LSBpZmVsc2UoaXMubmEob3V0JHR3X3R3b3JjYV9pZCksJycsYXMuY2hhcmFjdGVyKG91dCR0d190d29yY2FfaWQpKQ0Kb3V0JGFtX2F1dG9yX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkYW1fYXV0b3JfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkYW1fYXV0b3JfaWQpKQ0Kb3V0JGFtX25hendpc2tvIDwtIGlmZWxzZShpcy5uYShvdXQkYW1fbmF6d2lza28pLCcnLGFzLmNoYXJhY3RlcihvdXQkYW1fbmF6d2lza28pKQ0Kb3V0JGFtX2ltaWUgPC0gaWZlbHNlKGlzLm5hKG91dCRhbV9pbWllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGFtX2ltaWUpKQ0Kb3V0JHphX3R5dHVsIDwtIGlmZWxzZShpcy5uYShvdXQkemFfdHl0dWwpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdHl0dWwpKQ0Kb3V0JHphX3R5dHVsX29yeWdpbmFsdSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3R5dHVsX29yeWdpbmFsdSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90eXR1bF9vcnlnaW5hbHUpKQ0Kb3V0JHphX2plenlrX29yeWdpbmFsdSA8LSBpZmVsc2UoaXMubmEob3V0JHphX2plenlrX29yeWdpbmFsdSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9qZXp5a19vcnlnaW5hbHUpKQ0Kb3V0JG9zX29zb2JhX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkb3Nfb3NvYmFfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkb3Nfb3NvYmFfaWQpKQ0Kb3V0JG9zX25hendpc2tvIDwtIGlmZWxzZShpcy5uYShvdXQkb3NfbmF6d2lza28pLCcnLGFzLmNoYXJhY3RlcihvdXQkb3NfbmF6d2lza28pKQ0Kb3V0JG9zX2ltaWUgPC0gaWZlbHNlKGlzLm5hKG91dCRvc19pbWllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JG9zX2ltaWUpKQ0Kb3V0JGZvX3N5bWJvbCA8LSBpZmVsc2UoaXMubmEob3V0JGZvX3N5bWJvbCksJycsYXMuY2hhcmFjdGVyKG91dCRmb19zeW1ib2wpKQ0Kb3V0JHphX29waXNfd3Nwb2x0d29yY293IDwtIGlmZWxzZShpcy5uYShvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3cpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3cpKQ0Kb3V0JHphX3d5ZGFuaWUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV93eWRhbmllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3d5ZGFuaWUpKQ0Kb3V0JHphX3RvbXkgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90b215KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3RvbXkpKQ0Kb3V0JHphX2luc3R5dHVjamEgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9pbnN0eXR1Y2phKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX2luc3R5dHVjamEpKQ0Kb3V0JHd5X3d5ZGF3bmljdHdvX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkd3lfd3lkYXduaWN0d29faWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkd3lfd3lkYXduaWN0d29faWQpKQ0Kb3V0JHd5X21pZWpzY2UgPC0gaWZlbHNlKGlzLm5hKG91dCR3eV9taWVqc2NlKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHd5X21pZWpzY2UpKQ0Kb3V0JHd5X25hendhIDwtIGlmZWxzZShpcy5uYShvdXQkd3lfbmF6d2EpLCcnLGFzLmNoYXJhY3RlcihvdXQkd3lfbmF6d2EpKQ0Kb3V0JHphX3Jva193eWRhbmlhIDwtIGlmZWxzZShpcy5uYShvdXQkemFfcm9rX3d5ZGFuaWEpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfcm9rX3d5ZGFuaWEpKQ0Kb3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraSA8LSBpZmVsc2UoaXMubmEob3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2kpKQ0Kb3V0JHphX3NlcmlhX3d5ZGF3bmljemEgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9zZXJpYV93eWRhd25pY3phKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3NlcmlhX3d5ZGF3bmljemEpKQ0Kb3V0JHR3X25hendpc2tvIDwtIGlmZWxzZShpcy5uYShvdXQkdHdfbmF6d2lza28pLCcnLGFzLmNoYXJhY3RlcihvdXQkdHdfbmF6d2lza28pKQ0Kb3V0JHR3X2ltaWUgPC0gaWZlbHNlKGlzLm5hKG91dCR0d19pbWllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHR3X2ltaWUpKQ0Kb3V0JHByYWNvd25payA8LSBpZmVsc2UoaXMubmEob3V0JHByYWNvd25payksJycsYXMuY2hhcmFjdGVyKG91dCRwcmFjb3duaWspKQ0Kb3V0JHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoaXMubmEob3V0JHphX2Fkbm90YWNqZSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9hZG5vdGFjamUpKQ0Kb3V0JEJOX1VSTCA8LSBpZmVsc2UoaXMubmEob3V0JEJOX1VSTCksJycsYXMuY2hhcmFjdGVyKG91dCRCTl9VUkwpKQ0KDQpvdXQgJSQlICANCiAgICB7IHJla29yZF9CTj09bGFnKHJla29yZF9CTiwpICYgcnpfbmF6d2E9PWxhZyhyel9uYXp3YSwpICYgemFfcm9fcm9rPT1sYWcoemFfcm9fcm9rLCkgJiB6YV90eXBlPT1sYWcoemFfdHlwZSwpICYgcnpfcm9kemFqX2lkPT1sYWcocnpfcm9kemFqX2lkLCkgJiBEWl9OQVpXQT09bGFnKERaX05BWldBLCkgJiBEWl9EWklBTF9JRD09bGFnKERaX0RaSUFMX0lELCkgJiB0d190d29yY2FfaWQ9PWxhZyh0d190d29yY2FfaWQsKSAmIHphX3R5dHVsPT1sYWcoemFfdHl0dWwsKSAmIHphX3R5dHVsX29yeWdpbmFsdT09bGFnKHphX3R5dHVsX29yeWdpbmFsdSwpICYgemFfamV6eWtfb3J5Z2luYWx1PT1sYWcoemFfamV6eWtfb3J5Z2luYWx1LCkgJiB6YV9vcGlzX3dzcG9sdHdvcmNvdz09bGFnKHphX29waXNfd3Nwb2x0d29yY293LCkgJiB6YV93eWRhbmllPT1sYWcoemFfd3lkYW5pZSwpICYgemFfdG9teT09bGFnKHphX3RvbXksKSAmIHphX2luc3R5dHVjamE9PWxhZyh6YV9pbnN0eXR1Y2phLCkgJiB6YV9yb2tfd3lkYW5pYT09bGFnKHphX3Jva193eWRhbmlhLCkgJiB6YV9vcGlzX2Zpenljem55X2tzaWF6a2k9PWxhZyh6YV9vcGlzX2Zpenljem55X2tzaWF6a2ksKSAmIHphX3NlcmlhX3d5ZGF3bmljemE9PWxhZyh6YV9zZXJpYV93eWRhd25pY3phLCkgJiB0d19uYXp3aXNrbz09bGFnKHR3X25hendpc2tvLCkgJiB0d19pbWllPT1sYWcodHdfaW1pZSwpICYgcHJhY293bmlrPT1sYWcocHJhY293bmlrLCkgJiB6YV9hZG5vdGFjamU9PWxhZyh6YV9hZG5vdGFjamUsKSAmIEJOX1VSTD09bGFnKEJOX1VSTCwpfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gb3V0JHNhbWUNCm91dCRzYW1lWzFdIDwtIDANCm91dCRkemllbG9uZSA8LSBwYXN0ZShvdXQkYW1fYXV0b3JfaWQsb3V0JGFtX25hendpc2tvLG91dCRhbV9pbWllLG91dCRvc19vc29iYV9pZCxvdXQkb3NfbmF6d2lza28sb3V0JG9zX2ltaWUsb3V0JGZvX3N5bWJvbCxvdXQkd3lfd3lkYXduaWN0d29faWQsb3V0JHd5X21pZWpzY2Usb3V0JHd5X25hendhLHNlcCA9ICIiKQ0KDQpvdXQgPC0gb3V0ICU+JQ0KICBmaWx0ZXIoIShzYW1lPT0xJmR6aWVsb25lPT0iIikpICU+JQ0KICBzZWxlY3QoMTozMykNCg0Kb3V0ICUkJSAgDQogICAgeyByZWtvcmRfQk49PWxhZyhyZWtvcmRfQk4sKSAmIHJ6X25hendhPT1sYWcocnpfbmF6d2EsKSAmIHphX3JvX3Jvaz09bGFnKHphX3JvX3JvaywpICYgemFfdHlwZT09bGFnKHphX3R5cGUsKSAmIHJ6X3JvZHphal9pZD09bGFnKHJ6X3JvZHphal9pZCwpICYgRFpfTkFaV0E9PWxhZyhEWl9OQVpXQSwpICYgRFpfRFpJQUxfSUQ9PWxhZyhEWl9EWklBTF9JRCwpICYgdHdfdHdvcmNhX2lkPT1sYWcodHdfdHdvcmNhX2lkLCkgJiB6YV90eXR1bD09bGFnKHphX3R5dHVsLCkgJiB6YV90eXR1bF9vcnlnaW5hbHU9PWxhZyh6YV90eXR1bF9vcnlnaW5hbHUsKSAmIHphX2plenlrX29yeWdpbmFsdT09bGFnKHphX2plenlrX29yeWdpbmFsdSwpICYgemFfb3Bpc193c3BvbHR3b3Jjb3c9PWxhZyh6YV9vcGlzX3dzcG9sdHdvcmNvdywpICYgemFfd3lkYW5pZT09bGFnKHphX3d5ZGFuaWUsKSAmIHphX3RvbXk9PWxhZyh6YV90b215LCkgJiB6YV9pbnN0eXR1Y2phPT1sYWcoemFfaW5zdHl0dWNqYSwpICYgemFfcm9rX3d5ZGFuaWE9PWxhZyh6YV9yb2tfd3lkYW5pYSwpICYgemFfb3Bpc19maXp5Y3pueV9rc2lhemtpPT1sYWcoemFfb3Bpc19maXp5Y3pueV9rc2lhemtpLCkgJiB6YV9zZXJpYV93eWRhd25pY3phPT1sYWcoemFfc2VyaWFfd3lkYXduaWN6YSwpICYgdHdfbmF6d2lza289PWxhZyh0d19uYXp3aXNrbywpICYgdHdfaW1pZT09bGFnKHR3X2ltaWUsKSAmIHByYWNvd25paz09bGFnKHByYWNvd25paywpICYgemFfYWRub3RhY2plPT1sYWcoemFfYWRub3RhY2plLCkgJiBCTl9VUkw9PWxhZyhCTl9VUkwsKX0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IG91dCRzYW1lDQoNCiN1Y2nEmWNpZSB6Ynl0IGTFgnVnaWNoIGNpxIVnw7N3IHpuYWvDs3csIGJ5IHdlc3rFgnkgZG8gb3JhY2xlJ2ENCmRsdWdvc2NpIDwtIGRhdGEuZnJhbWUocG9sZSA9IGMoImFtX25hendpc2tvIiwgImFtX2ltaWUiLCAiemFfdHl0dWwiLCAiemFfdHl0dWxfb3J5Z2luYWx1IiwgInphX2plenlrX29yeWdpbmFsdSIsICJvc19uYXp3aXNrbyIsICJvc19pbWllIiwgInphX29waXNfd3Nwb2x0d29yY293IiwgInphX2luc3R5dHVjamEiLCAid3lfbWllanNjZSIsICJ3eV9uYXp3YSIsICJ6YV9vcGlzX2Zpenljem55X2tzaWF6a2kiLCAiemFfc2VyaWFfd3lkYXduaWN6YSIsICJ0d19uYXp3aXNrbyIsICJ0d19pbWllIiwgInphX2Fkbm90YWNqZSIpLCBsaWN6YmFfem5ha293ID0gYyg1MCw0MCw1MDAsNTAwLDEwMCw1MCw0MCw1MDAsMjU1LDQwLDI1NSwxMDAwLDI1NSwyMDAsNDAsMjAwMCkpDQp4IDwtIG1hdGNoKGRsdWdvc2NpJHBvbGUsbmFtZXMob3V0KSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgZGx1Z29zYyA8LSBkbHVnb3NjaSRsaWN6YmFfem5ha293W21hdGNoKG5hbWVzKG91dFtpXSksZGx1Z29zY2kkcG9sZSldDQogIG91dCR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGRsdWdvc2M8bmNoYXIoYXMuY2hhcmFjdGVyKG91dFssaV0pKSZvdXQkemFfYWRub3RhY2plIT0iIixwYXN0ZShvdXQkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgUG9sZSAiLGFzLmNoYXJhY3RlcihuYW1lcyhvdXRbaV0pKSwiIGJ5xYJvIHpieXQgZMWCdWdpZSBpIHpvc3RhxYJvIHByenljacSZdGUuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxzZXAgPSAiIyAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRsdWdvc2M8bmNoYXIoYXMuY2hhcmFjdGVyKG91dFssaV0pKSZvdXQkemFfYWRub3RhY2plPT0iIixwYXN0ZSgiVVdBR0EhIFBvbGUgIixhcy5jaGFyYWN0ZXIobmFtZXMob3V0W2ldKSksIiBiecWCbyB6Ynl0IGTFgnVnaWUgaSB6b3N0YcWCbyBwcnp5Y2nEmXRlLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksYXMuY2hhcmFjdGVyKG91dCR6YV9hZG5vdGFjamUpKSkNCiAgDQogIG91dFssaV0gPC0gaWZlbHNlKGRsdWdvc2M8bmNoYXIoYXMuY2hhcmFjdGVyKG91dFssaV0pKSxhcy5jaGFyYWN0ZXIoc3Vic3RyKG91dFssaV0sMSxkbHVnb3NjKSksYXMuY2hhcmFjdGVyKG91dFssaV0pKQ0KfQ0KDQpvdXQkcmVrb3JkX0JOW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkcnpfbmF6d2Fbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9yb19yb2tbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90eXBlW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkcnpfcm9kemFqX2lkW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkRFpfTkFaV0Fbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCREWl9EWklBTF9JRFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHR3X3R3b3JjYV9pZFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3R5dHVsW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdHl0dWxfb3J5Z2luYWx1W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfamV6eWtfb3J5Z2luYWx1W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3dbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV93eWRhbmllW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdG9teVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX2luc3R5dHVjamFbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9yb2tfd3lkYW5pYVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3NlcmlhX3d5ZGF3bmljemFbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR0d19uYXp3aXNrb1tvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHR3X2ltaWVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCRwcmFjb3duaWtbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9hZG5vdGFjamVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCRCTl9VUkxbb3V0JHNhbWUgPT0gMV0gPC0gIiINCg0KI3ByenlwaXNhbmllIGRvIGF1dG9tYXR5Y3puZWdvIE9LIHJlZGFrdG9yYSAiYXV0b21hdCINCm91dCA8LSBvdXQgJT4lDQogIG11dGF0ZShwcmFjb3duaWsgPSBpZmVsc2UocmVrb3JkX0JOICVpbiUgYXV0b21hdHljem55X0lPSyRyZWtvcmRfQk4sIkFVVE9NQVQiLGFzLmNoYXJhY3RlcihwcmFjb3duaWspKSkgJT4lDQogIHNlbGVjdCgxOjMzKQ0KDQojcMSZdGxhIHphcGlzdWrEhWNhIHBvIG9rLiAyMDAwIHdpZXJzenkgeiB1d3pnbMSZZG5pZW5pZW0ga29tcGxldG5vxZtjaSByZWtvcmTDs3cgYmlibGlvZ3JhZmljem55Y2ggcm96cGlzYW55Y2ggbmEga2lsa2Egd2llcnN6eQ0Kb3V0IDwtIG91dCAlPiUNCiAgbXV0YXRlKHBvZHppYWwgPSBpZmVsc2UocmVrb3JkX0JOIT0iIixhcy5jaGFyYWN0ZXIocmVrb3JkX0JOKSxOQSkpICU+JQ0KICBmaWxsKHBvZHppYWwpDQppbGUgPC0gdW5pcXVlKG91dCRwb2R6aWFsKQ0KaWxlIDwtIHNwbGl0KHVuaXF1ZShpbGUpLCBjZWlsaW5nKHNlcV9hbG9uZyh1bmlxdWUoaWxlKSkvMTUwMCkpDQojYWt0dWFsaXphY2phIC0gd3Bpc3ogd8WCYcWbY2l3eSByb2sgdyDFm2NpZcW8a8SZIHBsaWt1DQp4IDwtIDE6bGVuZ3RoKGlsZSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgZmluYWwgPC0gb3V0ICU+JQ0KICAgIGZpbHRlcihwb2R6aWFsICVpbiUgaWxlW1tpXV0pICU+JQ0KICAgIHNlbGVjdCgtcG9kemlhbCkNCiAgd3JpdGUueGxzeChmaW5hbCwgcGFzdGUoIkM6L1VzZXJzL0NlemFyeS9EZXNrdG9wLzIwMTFfcG9kbWlvdG93YV9kb19pbXBvcnR1IixpLCIueGxzeCIsc2VwID0gIiIpLHNoZWV0TmFtZSA9ICJnb3Rvd2UiKQ0KfQ0KYGBgDQoNCmBgYHtyIGtzacSFxbxraSBwcnplZG1pb3Rvd2V9DQpibl9vayA8LSBjaHVuazExDQpkYXRhIDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwcnplZG1pb3Rvd2EiKSAlPiUNCiAgbXV0YXRlKHJlZGFrdG9yX2R6aWFsdSA9IHBhc3RlKHJlZGFrdG9yX2R6aWFsdSwiX3ByemVkbSIsc2VwID0gIiIpKQ0KI3V3b2xuaWVuaWUga29sdW1uIHogZGFueW1pIHogYm4gaSBwcnpldHdvcnplbmllIGRvIFBCTA0KIzE6IHphX3V3YWdpLCByel9uYXp3YSwgemFfcm9fcm9rLCB6YV90eXBlLCByel9yb2R6YWpfaWQsIHR3X3R3b3JjYV9pZCwgdHdfbmF6d2lza28sIHR3X2ltaWUsIGR6X2R6aWFsX2lkLCBkel9uYXp3YSwgcmVkYWt0b3JfZHppYWx1DQpwb2xhX3BibCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIFJaX05BWldBLCBaQV9ST19ST0sgPSByb2ssIFJaX1JPRFpBSl9JRCwgVFdfVFdPUkNBX0lELCBUV19OQVpXSVNLTywgVFdfSU1JRSwgRFpfRFpJQUxfSUQsIERaX05BWldBLCByZWRha3Rvcl9kemlhbHUpICU+JQ0KICBtdXRhdGUoWkFfVFlQRSA9ICJLUyIpDQojMjogYXV0b3INCkJOX2F1dG9yIDwtIGRhdGEgJT4lDQogIHNlbGVjdChYMTAwLFgyNDUsWkFfVVdBR0kpDQojcG9sZSAxMDANCm1hcmNfZmllbGRfMTAwIDwtIEJOX2F1dG9yICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDEwMCklPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlcGxhY2VfYWxsKFgxMDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDEwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZW1vdmVfYWxsKFgxMDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChCTl9hdXRvciRYMTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzEwMDwtY2JpbmQobWFyY19maWVsZF8xMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8xMDAkWDEwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzEwMCRYMTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzEwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzEwMCRYMTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8xMDAkWDEwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQojcG9sZSAyNDUNCm1hcmNfZmllbGRfMjQ1IDwtIEJOX2F1dG9yICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSklPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChCTl9hdXRvciRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQpCTl9hdXRvciA8LSBtYXJjX2ZpZWxkXzEwMCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUoYCRhYCA9IGlmZWxzZSghaXMubmEoYCRiYCkscGFzdGUoYCRhYCxgJGJgLHNlcCA9ICIgIiksYXMuY2hhcmFjdGVyKGAkYWApKSkgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShBTV9OQVpXSVNLTyA9IGlmZWxzZShncmVwbCgiXFx8IixgJGFgKSwgc3RyX3JlcGxhY2VfYWxsKHN0cl9yZW1vdmVfYWxsKGAkYWAsIiwiKSwiXFx8IiwiLCAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiLCIsYCRhYCksc3RyX3JlcGxhY2VfYWxsKGAkYWAsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoYCRhYCkpKSwNCiAgICAgICAgIEFNX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIlxcfCIsYCRhYCksIioiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIiwiLGAkYWApLHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSkgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMjQ1LGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSwgWDI0NWMgPSBgJGNgKQ0KICANCnggPC0gMTpsZW5ndGhzKEJOX2F1dG9yWzFdKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgQk5fYXV0b3IkY3p5X25hendpc2tvW2ldIDwtIGdyZXBsKEJOX2F1dG9yJEFNX05BWldJU0tPW2ldLEJOX2F1dG9yJFgyNDVjW2ldKQ0KICBCTl9hdXRvciRjenlfaW1pZVtpXSA8LSBncmVwbChCTl9hdXRvciRBTV9JTUlFW2ldLEJOX2F1dG9yJFgyNDVjW2ldKQ0KfQ0KDQpCTl9hdXRvciA8LSBCTl9hdXRvciAlPiUNCiAgbXV0YXRlKFpBX0FETk9UQUNKRSA9IGlmZWxzZShjenlfbmF6d2lza289PUZBTFNFfGN6eV9pbWllPT1GQUxTRSxwYXN0ZSgiVVdBR0EhIEtvbmZsaWt0IHcgZGFueWNoIG9zb2Jvd3ljaCB3IHBvbGFjaCAxMDAgaSAyNDUuIFBvcsOzd25haiBwb2xlIGF1dG9yIHcgZm9ybXVsYXJ6dSB6IHBvbGVtIEJOOiAiLFgyNDVjLHNlcCA9ICIiKSxOQSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSxaQV9BRE5PVEFDSkUpICU+JQ0KICBtdXRhdGUobmF6d2EgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKHBhc3RlKEFNX05BWldJU0tPLEFNX0lNSUUsIHNlcCA9ICIiKSksICJcXFciLCAiIikpICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfYXV0b3J6eSAlPiUgc2VsZWN0KEFNX0FVVE9SX0lELEFNX0tSWVBUT05JTSxBTV9MSUNaQkFfWkFQSVNPVyxuYXp3YSkgJT4lIGZpbHRlcihpcy5uYShBTV9LUllQVE9OSU0pKSxieT0ibmF6d2EiKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSxBTV9OQVpXSVNLTyxBTV9JTUlFLC1BTV9MSUNaQkFfWkFQSVNPVykNCkJOX2F1dG9yJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZChCTl9hdXRvclsxOjNdKSkNCkJOX2F1dG9yIDwtIEJOX2F1dG9yWyFkdXBsaWNhdGVkKEJOX2F1dG9yJGlkX2dydXB5KSxdICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSxaQV9BRE5PVEFDSkUsQU1fQVVUT1JfSUQpDQoNCiMzOiB0eXR1xYINCiNwb2xlIDI0NQ0KbWFyY19maWVsZF8yNDUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIn4iKSwNCiAgICAgICAgIFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ1PC1jYmluZChtYXJjX2ZpZWxkXzI0NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NSRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ1JFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ1JFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NSRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCnphX3R5dHVsIDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGJgLGAkbmAsYCRwYCkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKGAkYWAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRhYCksIiIsYXMuY2hhcmFjdGVyKGAkYWApKSxjb2xsYXBzZSA9ICIgIiksDQogICAgICAgICBgJGJgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYmApLCIiLGFzLmNoYXJhY3RlcihgJGJgKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICAgYCRuYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJG5gKSwiIixhcy5jaGFyYWN0ZXIoYCRuYCkpLGNvbGxhcHNlID0gIiAiKSwNCiAgICAgICAgIGAkcGAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRwYCksIiIsYXMuY2hhcmFjdGVyKGAkcGApKSxjb2xsYXBzZSA9ICIgIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICB1bml0ZSgiWkFfVFlUVUwiLGAkYWA6YCRwYCxzZXAgPSAiICIsbmEucm0gPSBUUlVFKSAlPiUNCiAgbXV0YXRlKFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCIgKyIsIiAiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gc3RyX3JlbW92ZShaQV9UWVRVTCwgIlxccytcXC9cXHN7MCx9JCIpLA0KICAgICAgICAgWkFfVFlUVUwgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksYXMuY2hhcmFjdGVyKFpBX1RZVFVMKSkpKSksDQogICAgICAgICBaQV9UWVRVTCA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSxhcy5jaGFyYWN0ZXIoWkFfVFlUVUwpKSkpKSwNCiAgICAgICAgIFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCJcXC57M30gXFwuezN9IiwiLi4uICIpLA0KICAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVwbGFjZV9hbGwoWkFfVFlUVUwsIiA7ICIsIi4gIiksDQogICAgICAgICBaQV9UWVRVTCA9IGdzdWIoIiggOiApKC4pIiwiLiBcXFVcXDIiLHBlcmw9VFJVRSxaQV9UWVRVTCkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWkFfVFlUVUwpDQoNCiM0OiB0eXR1xYIgb3J5Z2luYcWCdQ0KI3BvbGUgMjQ2DQptYXJjX2ZpZWxkXzI0NiA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NiklPiUNCiAgZmlsdGVyKFgyNDYhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDY9c3RyX3JlbW92ZV9hbGwoWDI0NiwifiIpLA0KICAgICAgICAgWDI0Nj1zdHJfcmVwbGFjZV9hbGwoWDI0NiwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ2IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDYhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDY9c3RyX3JlbW92ZV9hbGwoWDI0NiwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ2LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NiwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NilbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDY8LWNiaW5kKG1hcmNfZmllbGRfMjQ2LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ2JFgyNDYgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDYkWDI0NixzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDZbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDYkWDI0Niksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ2JFgyNDYpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KaWYoIiRuIiAlaW4lIGNvbG5hbWVzKG1hcmNfZmllbGRfMjQ2KSkgew0KbWFyY19maWVsZF8yNDYgPC0gbWFyY19maWVsZF8yNDZbLCBjb2xTdW1zKGlzLm5hKG1hcmNfZmllbGRfMjQ2KSkgIT0gbnJvdyhtYXJjX2ZpZWxkXzI0NildICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIm9yeWciLFgyNDYpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCxgJG5gLGAkcGApICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiLCAiKSwNCiAgICAgICAgIGAkYmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSxjb2xsYXBzZSA9ICIiKSwNCiAgICAgICAgIGAkbmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRuYCksIiIsYXMuY2hhcmFjdGVyKGAkbmApKSxjb2xsYXBzZSA9ICIiKSwNCiAgICAgICAgIGAkcGAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRwYCksIiIsYXMuY2hhcmFjdGVyKGAkcGApKSxjb2xsYXBzZSA9ICIiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIHVuaXRlKCJYMjQ2IixgJGFgOmAkcGAsc2VwID0gIiAiLG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoWDI0NiA9IHN0cl9yZXBsYWNlX2FsbChYMjQ2LCIgKyIsIiAiKSwNCiAgICAgICAgIFgyNDYgPSBzdHJfcmVtb3ZlKFgyNDYsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFgyNDYgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksYXMuY2hhcmFjdGVyKFgyNDYpKSkpKSwNCiAgICAgICAgIFgyNDYgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApezAsMX0oLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLGFzLmNoYXJhY3RlcihYMjQ2KSkpKSksDQogICAgICAgICBYMjQ2ID0gc3RyX3JlcGxhY2VfYWxsKFgyNDYsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgICBYMjQ2ID0gZ3N1YigiKCA6ICkoLikiLCIuIFxcVVxcMiIscGVybD1UUlVFLFgyNDYpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLCBYMjQ2KQ0KfSBlbHNlIHsNCiAgbWFyY19maWVsZF8yNDYgPC0gbWFyY19maWVsZF8yNDZbLCBjb2xTdW1zKGlzLm5hKG1hcmNfZmllbGRfMjQ2KSkgIT0gbnJvdyhtYXJjX2ZpZWxkXzI0NildICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIm9yeWciLFgyNDYpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKGAkYWAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRhYCksIiIsYXMuY2hhcmFjdGVyKGAkYWApKSxjb2xsYXBzZSA9ICIsICIpLA0KICAgICAgICAgYCRiYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGJgKSwiIixhcy5jaGFyYWN0ZXIoYCRiYCkpLGNvbGxhcHNlID0gIiIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgdW5pdGUoIlgyNDYiLGAkYWA6YCRiYCxzZXAgPSAiICIsbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShYMjQ2ID0gc3RyX3JlcGxhY2VfYWxsKFgyNDYsIiArIiwiICIpLA0KICAgICAgICAgWDI0NiA9IHN0cl9yZW1vdmUoWDI0NiwgIlxccytcXC9cXHN7MCx9JCIpLA0KICAgICAgICAgWDI0NiA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICAgWDI0NiA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICl7MCwxfSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksYXMuY2hhcmFjdGVyKFgyNDYpKSkpKSwNCiAgICAgICAgIFgyNDYgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSwNCiAgICAgICAgIFgyNDYgPSBnc3ViKCIoIDogKSguKSIsIi4gXFxVXFwyIixwZXJsPVRSVUUsWDI0NikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIFgyNDYpDQp9DQoNCiNwb2xlIDUwMA0KbWFyY19maWVsZF81MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg1MDApJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZW1vdmVfYWxsKFg1MDAsIn4iKSwNCiAgICAgICAgIFg1MDA9c3RyX3JlcGxhY2VfYWxsKFg1MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDUwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZW1vdmVfYWxsKFg1MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDUwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTAwPC1jYmluZChtYXJjX2ZpZWxkXzUwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzUwMCRYNTAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTAwJFg1MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTAwJFg1MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzUwMCRYNTAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzUwMCA8LSBtYXJjX2ZpZWxkXzUwMCAlPiUNCiAgZmlsdGVyKGdyZXBsKCJvcnlnXFwuXFw6IixYNTAwKSkgJT4lDQogIG11dGF0ZShYNTAwID0gc3RyX3JlbW92ZShgJGFgLCJeVHl0XFwuIG9yeWdcXC46IHxeVHl0XFwsIG9yeWdcXC46IHxeLio/dHl0XFwuIG9yeWdcXC46ICIpLA0KICAgICAgICAgWDUwMCA9IHN0cl9yZW1vdmUoWDUwMCwgIlxccytcXC9cXHN7MCx9JCIpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDUwMCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDUwMCksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixYNTAwKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWDUwMCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDUwMCksYXMuY2hhcmFjdGVyKFg1MDApKSkpKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFg1MDApLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFg1MDApLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsWDUwMCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFg1MDApLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFg1MDApLGFzLmNoYXJhY3RlcihYNTAwKSkpKSksDQogICAgICAgICBYNTAwID0gc3RyX3JlcGxhY2VfYWxsKFg1MDAsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgICBYNTAwID0gc3RyX3JlbW92ZShYNTAwLCAiXFwuJCIpLA0KICAgICAgICAgWDUwMCA9IHN0cl9yZW1vdmUoWDUwMCwiKCx7MCwxfSB7MCwxfSlcXGR7NH0uKiR8KCwgdHwuIFQpeXQuIG9yeWcuIGN5a2x1OiIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg1MDApDQojdHl0dcWCIG9yeWdpbmHFgnUNCnphX3R5dHVsX29yeWdpbmFsdSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzI0NixieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF81MDAsYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShYNTAwID0gaWZlbHNlKGlzLm5hKFg1MDApLE5BLA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIm9yeWciLFg1MDApLE5BLGFzLmNoYXJhY3RlcihYNTAwKSkpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZSghaXMubmEoWDUwMCkmZ3JlcGwoIlxcLiAtICIsWDUwMCksc3RyX3JlcGxhY2UoWDUwMCwiKC4qPykoXFwuIC0gLiokKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihYNTAwKSksDQogICAgICAgICBYNTAwID0gaWZlbHNlKCFpcy5uYShYNTAwKSZncmVwbCgiTmEga3NpxIXFvGNlIHBzZXVkIixYNTAwKSxzdHJfcmVwbGFjZShYNTAwLCIoLio/KShcXC4gTmEga3NpxIXFvGNlIHBzZXVkLiokKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihYNTAwKSksDQogICAgICAgICBYNTAwID0gaWZlbHNlKCFpcy5uYShYNTAwKSZncmVwbCgiUHJ6ZWvFglxcLiB3ZyIsWDUwMCksc3RyX3JlcGxhY2UoWDUwMCwiKC4qPykoXFwuIFByemVrxYJcXC4gd2cuKiQpIiwiXFwxIiksYXMuY2hhcmFjdGVyKFg1MDApKSwNCiAgICAgICAgIFpBX1RZVFVMX09SWUdJTkFMVSA9IGlmZWxzZShpcy5uYShYMjQ2KSZpcy5uYShYNTAwKSxOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoIWlzLm5hKFg1MDApLGFzLmNoYXJhY3RlcihYNTAwKSxhcy5jaGFyYWN0ZXIoWDI0NikpKSwNCiAgICAgICAgIFpBX1RZVFVMX09SWUdJTkFMVSA9IHN0cl9yZW1vdmVfYWxsKFpBX1RZVFVMX09SWUdJTkFMVSwnXFwiJykpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWkFfVFlUVUxfT1JZR0lOQUxVKQ0KIzU6IGrEmXp5ayBvcnlnaW5hxYJ1DQptYXJjX2ZpZWxkXzA0MSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDA0MSklPiUNCiAgZmlsdGVyKFgwNDEhPSIiKSAlPiUNCiAgbXV0YXRlKFgwNDE9c3RyX3JlcGxhY2VfYWxsKFgwNDEsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDA0MSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMDQxIT0iIikgJT4lDQogIG11dGF0ZShYMDQxPXN0cl9yZW1vdmVfYWxsKFgwNDEsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDA0MSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgwNDEsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8wNDEpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMDQxPC1jYmluZChtYXJjX2ZpZWxkXzA0MSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzA0MSRYMDQxIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMDQxJFgwNDEsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMDQxWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMDQxJFgwNDEpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzA0MSRYMDQxKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQp6YV9qZXp5a19vcnlnaW5hbHUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8wNDEgJT4lIHNlbGVjdChaQV9VV0FHSSxaQV9KRVpZS19PUllHSU5BTFUgPSBgJGFgKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKFpBX0pFWllLX09SWUdJTkFMVSA9IHN0cl9yZXBsYWNlX2FsbChaQV9KRVpZS19PUllHSU5BTFUsIlxcJGEiLCIsIikpICU+JQ0KICB1bmlxdWUoKQ0KDQojNjogd3Nww7PFgnR3w7NyY3kNCm1hcmNfZmllbGRfNzAwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNzAwKSU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDcwMD1zdHJfcmVwbGFjZV9hbGwoWDcwMCwiKC4uXFwkYSkiLCJ8XFwxIiksDQogICAgICAgICBYNzAwPXN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg3MDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDcwMD1zdHJfcmVtb3ZlX2FsbChYNzAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg3MDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkgJT4lDQogIGZpbHRlcihYNzAwIT0iIikNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNzAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNzAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzcwMDwtY2JpbmQobWFyY19maWVsZF83MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF83MDAkWDcwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzcwMCRYNzAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzcwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzcwMCRYNzAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF83MDAkWDcwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQpCTl93c3BvbHR3b3JjYSA8LSBtYXJjX2ZpZWxkXzcwMCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9zb2JhID0gYCRhYCxmdW5rY2phID0gYCRlYCkgJT4lDQogIGZpbHRlcighaXMubmEoZnVua2NqYSkpICU+JQ0KICBtdXRhdGUob3NvYmEgPSBzdHJfcmVtb3ZlKG9zb2JhLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpLA0KICAgICAgICAgT1NfTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIob3NvYmEpKSwNCiAgICAgICAgIE9TX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDMiKSwiKiIpLA0KICAgICAgICAgd3NfcHJvc3R5ID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihvc29iYSksICJcXFciLCAiIiksDQogICAgICAgICBmdV9wcm9zdGEgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKGZ1bmtjamEpLCAiXFxXIiwgIiIpKSAlPiUNCiAgbGVmdF9qb2luKC4sUEJMX3dzcG9sdHdvcmN5ICU+JSBzZWxlY3QoT1NfT1NPQkFfSUQsT1NfTElDWkJBX1pBUElTT1csbmF6d2FfcHJvc3RhKSxieT1jKCJ3c19wcm9zdHkiPSJuYXp3YV9wcm9zdGEiKSkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksT1NfTkFaV0lTS08sT1NfSU1JRSwtT1NfTElDWkJBX1pBUElTT1cpDQpCTl93c3BvbHR3b3JjYSRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoQk5fd3Nwb2x0d29yY2FbMToyXSkpDQpCTl93c3BvbHR3b3JjYSA8LSBCTl93c3BvbHR3b3JjYVshZHVwbGljYXRlZChCTl93c3BvbHR3b3JjYSRpZF9ncnVweSksXSAlPiUNCiAgbGVmdF9qb2luKC4sUEJMX2Z1bmtjamUsYnk9YygiZnVfcHJvc3RhIj0ibmF6d2EiKSkgJT4lDQogIG11dGF0ZShmb19zeW1ib2wgPSBpZmVsc2UoZm9fc3ltYm9sPT0iTlVMTCIsTkEsYXMuY2hhcmFjdGVyKGZvX3N5bWJvbCkpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLE9TX05BWldJU0tPLE9TX0lNSUUsT1NfT1NPQkFfSUQsZm9fc3ltYm9sLGZvX25hendhLGZ1bmtjamEpDQoNCiN0dXRhaiBwcnplc3p1a2HEhyBYMjQ1IGkgem5hbGXFusSHIGLFgsSZZHkgd3Nww7PFgnR3w7NyY8Ozdw0KbWFyY19maWVsZF8yNDUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIn4iKSwNCiAgICAgICAgIFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ1PC1jYmluZChtYXJjX2ZpZWxkXzI0NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NSRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ1JFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ1JFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NSRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzI0NSA8LSBtYXJjX2ZpZWxkXzI0NSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDVjPWAkY2ApDQoNCkJOX3dzcG9sdHdvcmNhIDwtIEJOX3dzcG9sdHdvcmNhICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKQ0KDQp4IDwtIDE6bGVuZ3RocyhCTl93c3BvbHR3b3JjYVsxXSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIEJOX3dzcG9sdHdvcmNhJGN6eV9uYXp3aXNrb1tpXSA8LSBzdHJfZGV0ZWN0KEJOX3dzcG9sdHdvcmNhJFgyNDVjW2ldLEJOX3dzcG9sdHdvcmNhJE9TX05BWldJU0tPW2ldKQ0KICBCTl93c3BvbHR3b3JjYSRjenlfaW1pZVtpXSA8LSBncmVwbChCTl93c3BvbHR3b3JjYSRPU19JTUlFW2ldLEJOX3dzcG9sdHdvcmNhJFgyNDVjW2ldKQ0KfQ0KDQpCTl93c3BvbHR3b3JjYSA8LSBCTl93c3BvbHR3b3JjYSAlPiUNCiAgbXV0YXRlKFpBX0FETk9UQUNKRSA9IGlmZWxzZShjenlfbmF6d2lza289PUZBTFNFfGN6eV9pbWllPT1GQUxTRSxwYXN0ZSgiVVdBR0EhIEtvbmZsaWt0IHcgZGFueWNoIG9zb2Jvd3ljaCB3IHBvbGFjaCA3MDAgaSAyNDUuIFBvcsOzd25haiBwb2xhIHdzcMOzxYJ0w7NyY8OzdyB3IGZvcm11bGFyenUgeiBwb2xlbSBCTjogIixYMjQ1YyxzZXAgPSAiIiksTkEpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLE9TX05BWldJU0tPLE9TX0lNSUUsT1NfT1NPQkFfSUQsZm9fc3ltYm9sLGZvX25hendhLGZ1bmtjamEsWkFfQUROT1RBQ0pFKQ0KDQojNzogb3BpcyB3c3DDs8WCdHfDs3Jjw7N3DQpvcGlzX3dzcG9sdHdvcmNvdyA8LSBCTl93c3BvbHR3b3JjYSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGZ1bmtjamEsT1NfSU1JRSxPU19OQVpXSVNLTykgJT4lDQogIGZ1bGxfam9pbiguLG1hcmNfZmllbGRfMjQ1LGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKE9TX05BWldJU0tPKXwoaXMubmEoT1NfTkFaV0lTS08pJmdyZXBsKCJldCBhbFxcLiIsWDI0NWMpKSkgJT4lDQogIG11dGF0ZShqZXN0X2V0X2FsID0gZ3JlcGwoImV0IGFsXFwuIixYMjQ1YyksDQogICAgICAgICBPU19JTUlFID0gaWZlbHNlKE9TX0lNSUU9PSIqIiwiIixhcy5jaGFyYWN0ZXIoT1NfSU1JRSkpLA0KICAgICAgICAgb3BpcyA9IGlmZWxzZSghaXMubmEoT1NfTkFaV0lTS08pLHBhc3RlKGZ1bmtjamEsT1NfSU1JRSwgT1NfTkFaV0lTS08sIHNlcCA9ICIgIiksIiIpLA0KICAgICAgICAgb3BpcyA9IHN0cl9yZXBsYWNlX2FsbChvcGlzLCIgKyIsIiAiKSwNCiAgICAgICAgIG9waXMgPSBpZmVsc2Uob3Bpcz09IiAiLCIiLGFzLmNoYXJhY3RlcihvcGlzKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksb3BpcyxqZXN0X2V0X2FsKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUob3BpcyA9IHBhc3RlKG9waXMsY29sbGFwc2UgPSAiLCAiKSwNCiAgICAgICAgIGplc3RfZXRfYWwgPSBwYXN0ZSh1bmlxdWUoamVzdF9ldF9hbCksc2VwID0gIiIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKG9waXMgPSBpZmVsc2UoamVzdF9ldF9hbD09VFJVRSZvcGlzPT0iIiwiZXQgYWwuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGplc3RfZXRfYWwscGFzdGUob3BpcywiZXQgYWwuIixzZXAgPSAiICIpLG9waXMpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvcGlzKQ0KDQojNzAwDQptYXJjX2ZpZWxkXzcwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDcwMCklPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIiguLlxcJGEpIiwifFxcMSIpLA0KICAgICAgICAgWDcwMD1zdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNzAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlbW92ZV9hbGwoWDcwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpICU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDcwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzcwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF83MDA8LWNiaW5kKG1hcmNfZmllbGRfNzAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNzAwJFg3MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF83MDAkWDcwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF83MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF83MDAkWDcwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNzAwJFg3MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfNzAwIDwtIG1hcmNfZmllbGRfNzAwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksb3NvYmEgPSBgJGFgLGZ1bmtjamEgPSBgJGVgKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShmdW5rY2phKSkgJT4lDQogIG11dGF0ZShvc29iYSA9IHN0cl9yZW1vdmUob3NvYmEsIig/PD1bYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pKFxcLiQpIiksDQogICAgICAgICBPU19OQVpXSVNLTyA9IGlmZWxzZShncmVwbCgiLCIsb3NvYmEpLHN0cl9yZXBsYWNlX2FsbChvc29iYSwiKC4qPykoLCApKC4qKSIsIlxcMSIpLGFzLmNoYXJhY3Rlcihvc29iYSkpLA0KICAgICAgICAgT1NfSU1JRSA9IGlmZWxzZShncmVwbCgiLCIsb3NvYmEpLHN0cl9yZXBsYWNlX2FsbChvc29iYSwiKC4qPykoLCApKC4qKSIsIlxcMyIpLCIqIiksDQogICAgICAgICBmdW5rY2phX2R1emEgPSBzdHJfdG9fbG93ZXIoZnVua2NqYSksDQogICAgICAgICBvcGlzID0gcGFzdGUoZnVua2NqYV9kdXphLE9TX0lNSUUsT1NfTkFaV0lTS08sIHNlcCA9ICIgIiksDQogICAgICAgICBvcGlzX2R1enkgPSBwYXN0ZShmdW5rY2phLE9TX0lNSUUsT1NfTkFaV0lTS08sIHNlcCA9ICIgIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksb3BpcyxvcGlzX2R1enkpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShvcGlzID0gcGFzdGUob3Bpcyxjb2xsYXBzZSA9ICIuICIpLA0KICAgICAgICAgb3Bpc19kdXp5ID0gcGFzdGUob3Bpc19kdXp5LGNvbGxhcHNlID0gIi4gIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpDQoNCiNvcGlzIHdzcMOzxYJ0d8OzcmPDs3cgemUgc3RyZWZ5IG9kcG93aWVkemlhbG5vxZtjaSAyNDUNCm1hcmNfZmllbGRfMjQ1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJ+IiksDQogICAgICAgICBYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8yNDUgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGNgKQ0KDQojcG9yw7N3bmFuaWUgb3Bpc3Ugd3Nww7PFgnR3w7NyY8OzdyB6IDI0NSBpIDcwMA0Kd3Nwb2x0d29yY3kgPC0gbWFyY19maWVsZF83MDAgJT4lDQogIGZ1bGxfam9pbiguLG1hcmNfZmllbGRfMjQ1LGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBjU3BsaXQoLiwiJGMiLHNlcCA9ICIgOyAiLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogICNvZ3JhbmljemFuaWUgb3PDs2IgemUgc3RyZWZ5IG9kcG93aWVkemlhbG5vxZtjaQ0KICBtdXRhdGUoY3p5X21hbGEgPSBncmVwbCgiIFthLXrEmcOzxIXFm8WCxbzFusSHxYRdfF5bYS16xJnDs8SFxZvFgsW8xbrEh8WEXXxcXFtbYS16xJnDs8SFxZvFgsW8xbrEh8WEXSIsYCRjYCxpZ25vcmUuY2FzZSA9IEZBTFNFKSkgJT4lDQogIGZpbHRlcihjenlfbWFsYT09VFJVRSkgJT4lDQogIHNlbGVjdCgtY3p5X21hbGEpICU+JQ0KICAjbXV0YXRlKGAkY2AgPSBnc3ViKCJeKFxcWyl7MCwxfShbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pIiwiXFwxXFxVXFwyIixwZXJsID0gVFJVRSxgJGNgKSkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKFgyNDUgPSBwYXN0ZShgJGNgLCBjb2xsYXBzZSA9ICIsICIpKSAlPiUNCiAgc2VsZWN0KC1gJGNgKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShvcmRlcl9wYmwgPSBhcy5jaGFyYWN0ZXIoc3RyX2V4dHJhY3RfYWxsKG9waXMsIig/PD1efCB8XFxbfC0pKFtBLVpBw4HDgMOCw4PDhMSCxIDDhcSEw4ZFw4nDiMOKw4vEmsSSxJbEmEnDjcOMw47Dj8SqxK5JT8OTw5LDlMOVw5bFkMOYxZJVw5rDmcObw5zFsMWqxa9Zw51DxIbEjMOnRMSOxJDEkEfEosSeS8S2TMWBxLtOxYPDkcWHxYXFilLFmFPFmsWgxZ5Tw59UxaTFpsOexaI4WsW7xbnFvWEtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSIpKSwNCiAgICAgICAgIG9yZGVyX3BibCA9IHN0cl9yZXBsYWNlX2FsbChvcmRlcl9wYmwsIiguKj9cIikoLikoXCIuKj8uKSIsICJcXDIiKSwNCiAgICAgICAgIG9yZGVyX2JuID0gYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChYMjQ1LCIoPzw9XnwgfFxcW3wtKShbQS1aQcOBw4DDgsODw4TEgsSAw4XEhMOGRcOJw4jDisOLxJrEksSWxJhJw43DjMOOw4/EqsSuSU/Dk8OSw5TDlcOWxZDDmMWSVcOaw5nDm8OcxbDFqsWvWcOdQ8SGxIzDp0TEjsSQxJBHxKLEnkvEtkzFgcS7TsWDw5HFh8WFxYpSxZhTxZrFoMWeU8OfVMWkxabDnsWiOFrFu8W5xb1hLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkiKSksDQogICAgICAgICBvcmRlcl9ibiA9IHN0cl9yZXBsYWNlX2FsbChvcmRlcl9ibiwiKC4qP1wiKSguKShcIi4qPy4pIiwgIlxcMiIpLA0KICAgICAgICAgWDI0NSA9IHN0cl9yZW1vdmUoWDI0NSwgIlxcLiQiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsICJcXFsiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsICJcXF0iKSwNCiAgICAgICAgIG9yZGVyX3BibCA9IHN0cl9yZW1vdmVfYWxsKG9yZGVyX3BibCwgIlthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSIpLA0KICAgICAgICAgb3JkZXJfYm4gPSBzdHJfcmVtb3ZlX2FsbChvcmRlcl9ibiwgIlthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSIpLA0KICAgICAgICAgdG9fc2FtbyA9IG9yZGVyX3BibD09b3JkZXJfYm4sDQogICAgICAgICBYMjQ1ID0gZ3N1YigiKF5bYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pKC4qKSIsIlxcVVxcMVxcRVxcMiIscGVybCA9IFRSVUUsIFgyNDUpKSAlPiUNCiAgbGVmdF9qb2luKC4semFfamV6eWtfb3J5Z2luYWx1LGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBtdXRhdGUoY3p5X3BsID0gZ3JlcGwoInBvbCIsWkFfSkVaWUtfT1JZR0lOQUxVKXxpcy5uYShaQV9KRVpZS19PUllHSU5BTFUpLA0KICAgICAgICAgZGVjeXpqYSA9IGlmZWxzZSh0b19zYW1vPT1GQUxTRXxjenlfcGw9PUZBTFNFLEZBTFNFLFRSVUUpKQ0KDQp6YV9vcGlzX3dzcG9sdHdvcmNvdyA8LSB3c3BvbHR3b3JjeSAlPiUNCiAgbXV0YXRlKHphX29waXNfd3Nwb2x0d29yY293ID0gaWZlbHNlKGRlY3l6amE9PVRSVUUsYXMuY2hhcmFjdGVyKFgyNDUpLHBhc3RlKFgyNDUsb3Bpc19kdXp5LHNlcCA9ICIjIikpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXNfZHV6eSx6YV9vcGlzX3dzcG9sdHdvcmNvdykgJT4lDQogIGNTcGxpdCguLCJ6YV9vcGlzX3dzcG9sdHdvcmNvdyIsc2VwID0gIiMiLGRpcmVjdGlvbiA9ICJ3aWRlIikgJT4lDQogIG11dGF0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvd18yID0gaWZlbHNlKGlzLm5hKHphX29waXNfd3Nwb2x0d29yY293XzIpLCcnLGFzLmNoYXJhY3Rlcih6YV9vcGlzX3dzcG9sdHdvcmNvd18yKSksDQogICAgICAgICB0b19zYW1vID0gemFfb3Bpc193c3BvbHR3b3Jjb3dfMT09emFfb3Bpc193c3BvbHR3b3Jjb3dfMikgJT4lDQogIGZpbHRlcih0b19zYW1vPT1GQUxTRSkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKHphX29waXNfd3Nwb2x0d29yY293ID0gcGFzdGUoemFfb3Bpc193c3BvbHR3b3Jjb3dfMSx6YV9vcGlzX3dzcG9sdHdvcmNvd18yLHNlcCA9ICIjIiksDQogICAgICAgICB6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IHN0cl9yZW1vdmVfYWxsKHphX29waXNfd3Nwb2x0d29yY293LCJcXCMkIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksemFfb3Bpc193c3BvbHR3b3Jjb3cpDQoNCm9waXNfd3Nwb2x0d29yY293IDwtIG9waXNfd3Nwb2x0d29yY293ICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSB6YV9vcGlzX3dzcG9sdHdvcmNvdyRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcighaXMubmEob3BpcykpICU+JQ0KICByZW5hbWUoemFfb3Bpc193c3BvbHR3b3Jjb3cgPSBvcGlzKQ0KDQp6YV9vcGlzX3dzcG9sdHdvcmNvdyA8LSB6YV9vcGlzX3dzcG9sdHdvcmNvdyAlPiUNCiAgYmluZF9yb3dzKC4sb3Bpc193c3BvbHR3b3Jjb3cpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojOCB3eWRhbmllDQptYXJjX2ZpZWxkXzI1MCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI1MCklPiUNCiAgZmlsdGVyKFgyNTAhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNTA9c3RyX3JlcGxhY2VfYWxsKFgyNTAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI1MCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjUwIT0iIikgJT4lDQogIG11dGF0ZShYMjUwPXN0cl9yZW1vdmVfYWxsKFgyNTAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI1MCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNTAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNTApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjUwPC1jYmluZChtYXJjX2ZpZWxkXzI1MCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI1MCRYMjUwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjUwJFgyNTAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjUwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjUwJFgyNTApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI1MCRYMjUwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCnphX3d5ZGFuaWUgPC0gbWFyY19maWVsZF8yNTAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSwgd3lkYW5pZSA9IGAkYWApICU+JQ0KICBtdXRhdGUod3lkYW5pZSA9IHN0cl9yZW1vdmUod3lkYW5pZSwiIFxcLyQiKSkgJT4lDQogIHJpZ2h0X2pvaW4oLixkYXRhICU+JSBzZWxlY3QoWkFfVVdBR0kpLGJ5PSJaQV9VV0FHSSIpDQoNCiM5OiBpbnN0eXR1Y2phIHNwcmF3Y3phDQptYXJjX2ZpZWxkXzI0NSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSklPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwifiIpLA0KICAgICAgICAgWDI0NT1zdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDU8LWNiaW5kKG1hcmNfZmllbGRfMjQ1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ1JFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDUkWDI0NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDUkWDI0NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ1JFgyNDUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KemFfaW5zdHl0dWNqYSA8LSBtYXJjX2ZpZWxkXzI0NSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDVjPWAkY2ApICU+JQ0KICBmaWx0ZXIoIWlzLm5hKFgyNDVjKSkgJT4lDQogIG11dGF0ZShpbnN0eXR1Y2phID0gaWZlbHNlKGdyZXBsKCJcXDsiLFgyNDVjKSxzdHJfcmVwbGFjZV9hbGwoWDI0NWMsICIoLio/KShcXDsoPyEuKlxcOykpKCApKyguKj8kKSIsIlxcNCIpLCIiKSkgJT4lDQogIGxlZnRfam9pbiguLEJOX3dzcG9sdHdvcmNhLGJ5PSJaQV9VV0FHSSIpDQoNCnggPC0gMTpsZW5ndGhzKHphX2luc3R5dHVjamFbMV0pDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICB6YV9pbnN0eXR1Y2phJGN6eV9uYXp3aXNrb1tpXSA8LSBncmVwbCh6YV9pbnN0eXR1Y2phJE9TX05BWldJU0tPW2ldLHphX2luc3R5dHVjamEkWDI0NWNbaV0pDQogIHphX2luc3R5dHVjamEkY3p5X2ltaWVbaV0gPC0gZ3JlcGwoemFfaW5zdHl0dWNqYSRPU19JTUlFW2ldLHphX2luc3R5dHVjamEkWDI0NWNbaV0pDQp9DQoNCnphX2luc3R5dHVjamEgPC0gemFfaW5zdHl0dWNqYSAlPiUNCiAgZmlsdGVyKGlzLm5hKGN6eV9uYXp3aXNrbykmaXMubmEoY3p5X2ltaWUpKSAlPiUNCiAgZmlsdGVyKGluc3R5dHVjamEhPSIiKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgiXlxcW1thLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XXxeW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dIixpbnN0eXR1Y2phKSkgJT4lDQogIG11dGF0ZShpbnN0eXR1Y2phID0gc3RyX3JlbW92ZShpbnN0eXR1Y2phLCJcXC4kIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksaW5zdHl0dWNqYSkgJT4lDQogIHJpZ2h0X2pvaW4oLixkYXRhICU+JSBzZWxlY3QoWkFfVVdBR0kpLGJ5PSJaQV9VV0FHSSIpDQoNCiMxMDogd3lkYXduaWN0d28NCkJOX3d5ZGF3bmljdHdvIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSwgWDI2MCkgJT4lDQogIG11dGF0ZShYMjYwID0gc3RyX3JlcGxhY2VfYWxsKFgyNjAsInNcXC5uXFwuIiwgImIudy4iKSwgDQogICAgICAgICBYMjYwID0gc3RyX3JlcGxhY2VfYWxsKFgyNjAsInNcXC5sXFwuIiwgImIubS4iKSwgDQogICAgICAgICBYMjYwID0gc3RyX3JlcGxhY2VfYWxsKFgyNjAsIlNcXC5sXFwuIiwgImIubS4iKSwgDQogICAgICAgICBYMjYwID0gc3RyX3JlbW92ZShYMjYwLCJeXFxcXCsiKSwgDQogICAgICAgICByb2tfd3lkYW5pYSA9IHN0cl9leHRyYWN0X2FsbChYMjYwLCAiKD88PVxcJGMpLiooPz1cXCRlKXwoPzw9XFwkYykuKiIpLCANCiAgICAgICAgIGJlel9yb2t1ID0gc3RyX3JlcGxhY2VfYWxsKFgyNjAsICIuXFwkYy4qIiwgIiIpLCANCiAgICAgICAgIGlsZV93eWRhd25pY3R3ID0gc3RyX2NvdW50KGJlel9yb2t1LCAiXFwkYiIpLA0KICAgICAgICAgaWxlX21pZWpzYyA9IHN0cl9jb3VudChiZXpfcm9rdSwgIlxcJGEiKSwNCiAgICAgICAgIGtvbGVqbm9zYyA9IHN0cl9yZXBsYWNlX2FsbChhcy5jaGFyYWN0ZXIoc3RyX2V4dHJhY3RfYWxsKGJlel9yb2t1LCAiXFwkLiIpKSwgIlteYS16XSIsICIiKSwNCiAgICAgICAgIGJlel9yb2t1ID0gc3RyX3JlcGxhY2VfYWxsKGJlel9yb2t1LCAiO1xcJGIiLCAiOiRiIiksDQogICAgICAgICB3eWRhd19wb2R6aWVsID0gaWZlbHNlKGlsZV93eWRhd25pY3R3PmlsZV9taWVqc2N8a29sZWpub3NjPT0iY2FhYmIiLCBzdHJfcmVwbGFjZV9hbGwoYmV6X3Jva3UsICIoXFwkYSkoLio/KSggOlxcJGIuKj8pKCA6XFwkYikiLCAiXFwxXFwyXFwzIDskYVxcMlxcNCIpLGJlel9yb2t1KSwNCiAgICAgICAgIHd5ZGF3bmljdHdvX3Rlc3QgPSBzdHJfcmVwbGFjZV9hbGwod3lkYXdfcG9kemllbCwgIihcXCRiKSguKj8pKCA7XFwkYSkiLCAiXFwxXFwyfFxcMyIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHJva193eWRhbmlhLHd5ZGF3bmljdHdvX3Rlc3QpICU+JQ0KICBjU3BsaXQoLiwgInd5ZGF3bmljdHdvX3Rlc3QiLCBzZXAgPSAifCIsIGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIG11dGF0ZSh3eWRhd25pY3R3byA9IHN0cl9leHRyYWN0X2FsbCh3eWRhd25pY3R3b190ZXN0LCAiKD88PVxcJGIpKC4qKSIpLA0KICAgICAgICAgbWllanNjZV93eWRhbmlhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl9leHRyYWN0X2FsbCh3eWRhd25pY3R3b190ZXN0LCAiKD88PVxcJGEpKC4qKSg/PSB7MCwxfTogezAsMX1cXCRiKXwoPzw9XFwkYSkoLiopKCQpIiksIiA7XFwkYSIsICIsICIpLA0KICAgICAgICAgbmF6d2FfcHJvc3RhID0gc3RyX3RvX2xvd2VyKHN0cl9yZXBsYWNlX2FsbChzdHJfcmVwbGFjZV9hbGwodW5saXN0KHd5ZGF3bmljdHdvX3Rlc3QpLCAiXFwkXFx3IiwgIiIpLCAiXFxXIiwgIiIpKSkgJT4lDQogIGxlZnRfam9pbiguLFBCTF93eWRhd25pY3R3YSxieT0ibmF6d2FfcHJvc3RhIikgJT4lDQogIG11dGF0ZSh0b19zYW1vID0gd3lkYXduaWN0d289PVdZX05BWldBKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSwtdG9fc2FtbywtV1lfTElDWkJBX1pBUElTT1cpDQpCTl93eWRhd25pY3R3byRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoQk5fd3lkYXduaWN0d29bMTozXSkpDQpCTl93eWRhd25pY3R3byA8LSBCTl93eWRhd25pY3R3b1shZHVwbGljYXRlZChCTl93eWRhd25pY3R3byRpZF9ncnVweSksXSAlPiUNCiAgbXV0YXRlKFdZX05BWldBID0gaWZlbHNlKCFpcy5uYShXWV9OQVpXQSksYXMuY2hhcmFjdGVyKFdZX05BWldBKSxhcy5jaGFyYWN0ZXIod3lkYXduaWN0d28pKSwNCiAgICAgICAgIFdZX01JQVNUTyA9IGlmZWxzZSghaXMubmEoV1lfTUlBU1RPKSxhcy5jaGFyYWN0ZXIoV1lfTUlBU1RPKSxhcy5jaGFyYWN0ZXIobWllanNjZV93eWRhbmlhKSksDQogICAgICAgICByb2tfd3lkYW5pYSA9IHN0cl9yZXBsYWNlX2FsbChyb2tfd3lkYW5pYSwgIiguKikoXFwuKSIsICJcXDEiKSwNCiAgICAgICAgIHphX3Jva193eWRhbmlhID0gaWZlbHNlKG5jaGFyKHJva193eWRhbmlhKT09NCxhcy5jaGFyYWN0ZXIocm9rX3d5ZGFuaWEpLE5BKSwNCiAgICAgICAgIGRvX29waXN1ID0gaWZlbHNlKGlzLm5hKHphX3Jva193eWRhbmlhKSxwYXN0ZSgiWyIsc3RyX2V4dHJhY3Qocm9rX3d5ZGFuaWEsIlxcZHs0fSIpLCJdIixzZXAgPSAiIiksIiIpLA0KICAgICAgICAgV1lfTUlBU1RPID0gaWZlbHNlKHN1YnN0cihXWV9NSUFTVE8sMSwxKT09IlsiJnN1YnN0cihXWV9NSUFTVE8sbmNoYXIoV1lfTUlBU1RPKSxuY2hhcihXWV9NSUFTVE8pKSE9Il0iJmlzLm5hKFdZX1dZREFXTklDVFdPX0lEKSxwYXN0ZSh0cmltKFdZX01JQVNUTyksIl0iLHNlcCA9ICIiKSxhcy5jaGFyYWN0ZXIoV1lfTUlBU1RPKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksV1lfV1lEQVdOSUNUV09fSUQsV1lfTkFaV0EsV1lfTUlBU1RPLHphX3Jva193eWRhbmlhLGRvX29waXN1KQ0KDQojMTE6IG9waXMgZml6eWN6bnkga3NpxIXFvGtpDQojcG9sZSAzMDAgZG8gb3Bpc3UgZml6eWN6bmVnbw0KbWFyY19maWVsZF8zMDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgzMDApJT4lDQogIGZpbHRlcihYMzAwIT0iIikgJT4lDQogIG11dGF0ZShYMzAwPXN0cl9yZXBsYWNlX2FsbChYMzAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgzMDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDMwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDMwMD1zdHJfcmVtb3ZlX2FsbChYMzAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgzMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMzAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMzAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzMwMDwtY2JpbmQobWFyY19maWVsZF8zMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8zMDAkWDMwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzMwMCRYMzAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzMwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzMwMCRYMzAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8zMDAkWDMwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8zMDAgPC0gbWFyY19maWVsZF8zMDAgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIgXFw7KyR8IFxcOiskIiksDQogICAgICAgICBgJGJgID0gc3RyX3JlbW92ZShgJGJgLCIgXFw7KyR8IFxcOiskIiksDQogICAgICAgICBgJGVgID0gaWZlbHNlKGdyZXBsKCJDRC1ST018RFZEfFZDRHxDRCIsYCRlYCkmZ3JlcGwoIlxcKyBkeXNrfHDFgnl0IixgJGVgKSxzdHJfZXh0cmFjdChgJGVgLCIoPzw9XFwrKShkeXNrfHDFgnl0Lio/KShDRC1ST018RFZEfFZDRHxDRCkoXFwpKXswLDF9IiksDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiQ0QtUk9NfERWRHxWQ0R8Q0QiLGAkZWApLHN0cl9leHRyYWN0KGAkZWAsIiheLio/KShDRC1ST018RFZEfFZDRHxDRCkoXFwpKXswLDF9IiksTkEpKSwNCiAgICAgICAgIGAkYWAgPSBpZmVsc2UoaXMubmEoYCRhYCksIiIsYXMuY2hhcmFjdGVyKGAkYWApKSwNCiAgICAgICAgIGAkYmAgPSBpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSwNCiAgICAgICAgIGAkZWAgPSBpZmVsc2UoaXMubmEoYCRlYCksIiIsYXMuY2hhcmFjdGVyKGAkZWApKSkNCiNwb2xlIDUwMCBkbyBvcGlzdSBmaXp5Y3puZWdvDQptYXJjX2ZpZWxkXzUwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDUwMCklPiUNCiAgZmlsdGVyKFg1MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDA9c3RyX3JlcGxhY2VfYWxsKFg1MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDUwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZW1vdmVfYWxsKFg1MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDUwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTAwPC1jYmluZChtYXJjX2ZpZWxkXzUwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzUwMCRYNTAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTAwJFg1MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTAwJFg1MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzUwMCRYNTAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzUwMCA8LSBtYXJjX2ZpZWxkXzUwMCAlPiUNCiAgbXV0YXRlKGAkYWAgPSBpZmVsc2UoZ3JlcGwoIm9yeWcoXFwufFxcLCkiLFg1MDApJmdyZXBsKCJwc2V1ZHxuYXp3YSIsWDUwMCxpZ25vcmUuY2FzZSA9IFRSVUUpLHN0cl9yZXBsYWNlKGAkYWAsIiheLio/KShcXC4gKShcXHB7THV9LiokKSIsIlxcMyIpLGFzLmNoYXJhY3RlcihgJGFgKSkpICU+JSANCiAgZmlsdGVyKCFncmVwbCgib3J5ZyhcXC58XFwsKSIsYCRhYCkmZ3JlcGwoInBzZXVkfG5hendhfGRvdHljenxwb2wiLGAkYWAsaWdub3JlLmNhc2UgPSBUUlVFKSkgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIgXFw7KyR8IFxcOiskIikpDQogIA0KI3BvbGUgNTQ2IGRvIG9waXN1IGZpenljem5lZ28NCm1hcmNfZmllbGRfNTQ2IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNTQ2KSU+JQ0KICBmaWx0ZXIoWDU0NiE9IiIpICU+JQ0KICBtdXRhdGUoWDU0Nj1zdHJfcmVwbGFjZV9hbGwoWDU0NiwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNTQ2IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg1NDYhPSIiKSAlPiUNCiAgbXV0YXRlKFg1NDY9c3RyX3JlbW92ZV9hbGwoWDU0NiwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNTQ2LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDU0NiwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzU0NilbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF81NDY8LWNiaW5kKG1hcmNfZmllbGRfNTQ2LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNTQ2JFg1NDYgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF81NDYkWDU0NixzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF81NDZbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF81NDYkWDU0Niksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNTQ2JFg1NDYpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfNTQ2IDwtIG1hcmNfZmllbGRfNTQ2ICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpKQ0KDQp6YV9vcGlzX2tzIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX3d5ZGF3bmljdHdvICU+JSBzZWxlY3QoWkFfVVdBR0ksZG9fb3Bpc3UpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzMwMCAlPiUgc2VsZWN0KFpBX1VXQUdJLFgzMDBhPWAkYWAsWDMwMGI9YCRiYCxYMzAwZT1gJGVgKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF81MDAgJT4lIHNlbGVjdChaQV9VV0FHSSxYNTAwYT1gJGFgKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF81NDYgJT4lIHNlbGVjdChaQV9VV0FHSSxYNTQ2YT1gJGFgKSxieT0iWkFfVVdBR0kiKQ0KemFfb3Bpc19rc1tpcy5uYSh6YV9vcGlzX2tzKV0gIDwtICIiDQp6YV9vcGlzX2tzIDwtIHphX29waXNfa3MgJT4lDQogIG11dGF0ZSh6YV9vcGlzX2tzID0gcGFzdGUoaWZlbHNlKGRvX29waXN1IT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoZG9fb3Bpc3UpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDMwMGEhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYMzAwYSksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYMzAwYiE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKFgzMDBiKSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFgzMDBlIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDMwMGUpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDUwMGEhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYNTAwYSksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYNTQ2YSE9IiIsYXMuY2hhcmFjdGVyKFg1NDZhKSwiIiksc2VwID0gIiIpLA0KICAgICAgICAgemFfb3Bpc19rcyA9IHN0cl9yZW1vdmUoemFfb3Bpc19rcywiKCwgKSskIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksemFfb3Bpc19rcykgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLC1uY2hhcih6YV9vcGlzX2tzKSkNCnphX29waXNfa3MkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKHphX29waXNfa3NbMV0pKQ0KemFfb3Bpc19rcyA8LSB6YV9vcGlzX2tzWyFkdXBsaWNhdGVkKHphX29waXNfa3MkaWRfZ3J1cHkpLF0gJT4lDQogIHNlbGVjdCgtaWRfZ3J1cHkpDQoNCiMxMjogc2VyaWEgd3lkYXduaWN6YQ0KbWFyY19maWVsZF80OTAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg0OTAsWDgwMCxYODMwKSAlPiUNCiAgbXV0YXRlKFg0OTAgPSBpZmVsc2UoZ3JlcGwoIlVcXCsiLFg0OTApLGFzLmNoYXJhY3RlcihYODMwKSxhcy5jaGFyYWN0ZXIoWDQ5MCkpKSAlPiUNCiAgbXV0YXRlKFg4MDAgPSBpZmVsc2UoWDQ5MCE9IiIsIiIsYXMuY2hhcmFjdGVyKFg4MDApKSwNCiAgICAgICAgIFg4MzAgPSBpZmVsc2UoWDQ5MCE9IiIsIiIsYXMuY2hhcmFjdGVyKFg4MzApKSwNCiAgICAgICAgIFg4MDAgPSBzdHJfcmVwbGFjZShYODAwLCIoXFwkYSkoLiopKFxcJHQpIiwiXFwxIiksDQogICAgICAgICBYNDkwID0gaWZlbHNlKFg0OTA9PSIiJlg4MzAhPSIiLGFzLmNoYXJhY3RlcihYODMwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFg0OTA9PSIiJlg4MDAhPSIiLGFzLmNoYXJhY3RlcihYODAwKSxhcy5jaGFyYWN0ZXIoWDQ5MCkpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNDkwKSAlPiUNCiAgZmlsdGVyKFg0OTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg0OTA9c3RyX3JlcGxhY2VfYWxsKFg0OTAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDQ5MCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNDkwIT0iIikgJT4lDQogIG11dGF0ZShYNDkwPXN0cl9yZW1vdmVfYWxsKFg0OTAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDQ5MCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg0OTAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF80OTApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNDkwPC1jYmluZChtYXJjX2ZpZWxkXzQ5MCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzQ5MCRYNDkwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNDkwJFg0OTAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNDkwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNDkwJFg0OTApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzQ5MCRYNDkwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQp6YV9zZXJpYV93eWRhd25pY3phIDwtIG1hcmNfZmllbGRfNDkwICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoPSkoXFwkYSkiLCJcXDEgIiksDQogICAgICAgICBgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIgXFw7KyR8IFxcOiskIiksDQogICAgICAgICBgJHZgID0gaWZlbHNlKGlzLm5hKGAkdmApLCIiLGFzLmNoYXJhY3RlcihgJHZgKSkpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGAkYWApKSAlPiUNCiAgbXV0YXRlKHNlcmlhID0gc3RyX3JlbW92ZShwYXN0ZSgiKCIsYCRhYCwiOyAiLGAkdmAsIikiLHNlcCA9ICIiKSwiOyAoPz1cXCkkKSIpLA0KICAgICAgICAgc2VyaWEgPSBnc3ViKCIoIDogKSguKSIsIi4gXFxVXFwyIixwZXJsPVRSVUUsc2VyaWEpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHNlcmlhKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoc2VyaWEgPSBwYXN0ZShzZXJpYSxjb2xsYXBzZSA9ICIgIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUoc2VyaWEgPSBzdHJfcmVwbGFjZV9hbGwoc2VyaWEsIlxcJC4iLCI7ICIpKSAlPiUNCiAgcmlnaHRfam9pbiguLGRhdGEgJT4lIHNlbGVjdChaQV9VV0FHSSksYnk9IlpBX1VXQUdJIikNCg0KIzEzOiB0b215DQp6YV90b215IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIG11dGF0ZSh6YV90b215ID0gTkEpDQoNCiMxNDogYWRub3RhY2plDQp6YV9hZG5vdGFjamUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fYXV0b3IgJT4lIHNlbGVjdChaQV9VV0FHSSxaQV9BRE5PVEFDSkUpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSAlPiUgc2VsZWN0KFpBX1VXQUdJLFpBX0FETk9UQUNKRSksYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBwYXN0ZShpZmVsc2UoaXMubmEoWkFfQUROT1RBQ0pFLngpLCIiLHBhc3RlKGFzLmNoYXJhY3RlcihaQV9BRE5PVEFDSkUueCksIiMgIixzZXAgPSAiIikpLGlmZWxzZShpcy5uYShaQV9BRE5PVEFDSkUueSksIiIsYXMuY2hhcmFjdGVyKFpBX0FETk9UQUNKRS55KSksc2VwID0gIiIpLA0KICAgICAgICAgWkFfQUROT1RBQ0pFID0gc3RyX3JlbW92ZShaQV9BRE5PVEFDSkUsIigjICkrJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFpBX0FETk9UQUNKRSkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLC1uY2hhcihaQV9BRE5PVEFDSkUpKQ0KemFfYWRub3RhY2plJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZCh6YV9hZG5vdGFjamVbMV0pKQ0KemFfYWRub3RhY2plIDwtIHphX2Fkbm90YWNqZVshZHVwbGljYXRlZCh6YV9hZG5vdGFjamUkaWRfZ3J1cHkpLF0gJT4lDQogIHNlbGVjdCgtaWRfZ3J1cHkpDQoNCiMxNTogQk5fVVJMDQpCTl9VUkwgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLEJOX1VSTCkNCg0KI3d5csOzd25hbmllIGxpY3pieSB3aWVyc3p5IGRvIGxpY3pieSB3aWVyc3p5IG9iaWVrdHUgZGF0YQ0KQk5fYXV0b3IgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fYXV0b3IgJT4lIHNlbGVjdChaQV9VV0FHSSxBTV9BVVRPUl9JRCxBTV9OQVpXSVNLTyxBTV9JTUlFKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgZGRwbHkoLiwgLihaQV9VV0FHSSksIHN1bW1hcml6ZSwgQU1fQVVUT1JfSUQgPSBwYXN0ZShBTV9BVVRPUl9JRCwgY29sbGFwc2U9InwiKSwgQU1fTkFaV0lTS08gPSBwYXN0ZShBTV9OQVpXSVNLTywgY29sbGFwc2U9InwiKSwgQU1fSU1JRSA9IHBhc3RlKEFNX0lNSUUsIGNvbGxhcHNlPSJ8IikpDQpCTl93c3BvbHR3b3JjYSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSAlPiUgc2VsZWN0KFpBX1VXQUdJLE9TX09TT0JBX0lELE9TX05BWldJU0tPLE9TX0lNSUUsZm9fc3ltYm9sKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgZGRwbHkoLiwgLihaQV9VV0FHSSksIHN1bW1hcml6ZSwgT1NfT1NPQkFfSUQgPSBwYXN0ZShPU19PU09CQV9JRCwgY29sbGFwc2U9InwiKSwgT1NfTkFaV0lTS08gPSBwYXN0ZShPU19OQVpXSVNLTywgY29sbGFwc2U9InwiKSwgT1NfSU1JRSA9IHBhc3RlKE9TX0lNSUUsIGNvbGxhcHNlPSJ8IiksIGZvX3N5bWJvbCA9IHBhc3RlKGZvX3N5bWJvbCwgY29sbGFwc2U9InwiKSkgJT4lDQogIG11dGF0ZShmb19zeW1ib2wgPSBpZmVsc2UoZm9fc3ltYm9sPT0iTlVMTCIsIk5BIixhcy5jaGFyYWN0ZXIoZm9fc3ltYm9sKSkpDQpCTl93eWRhd25pY3R3byA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93eWRhd25pY3R3byAlPiUgc2VsZWN0KFpBX1VXQUdJLFdZX1dZREFXTklDVFdPX0lELFdZX05BWldBLFdZX01JQVNUTyx6YV9yb2tfd3lkYW5pYSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGRkcGx5KC4sIC4oWkFfVVdBR0kpLCBzdW1tYXJpemUsIFdZX1dZREFXTklDVFdPX0lEID0gcGFzdGUoV1lfV1lEQVdOSUNUV09fSUQsIGNvbGxhcHNlPSJ8IiksIFdZX05BWldBID0gcGFzdGUoV1lfTkFaV0EsIGNvbGxhcHNlPSJ8IiksIFdZX01JQVNUTyA9IHBhc3RlKFdZX01JQVNUTywgY29sbGFwc2U9InwiKSwgemFfcm9rX3d5ZGFuaWEgPSBwYXN0ZSh1bmlxdWUoemFfcm9rX3d5ZGFuaWEpLCBjb2xsYXBzZT0ifCIpKSAlPiUNCiAgbXV0YXRlKHphX3Jva193eWRhbmlhID0gaWZlbHNlKHphX3Jva193eWRhbmlhPT0iTkEiLCIiLGFzLmludGVnZXIoemFfcm9rX3d5ZGFuaWEpKSkNCg0KI3BvxYLEhWN6ZW5pZSB3c3p5c3RraWNoIGVsZW1lbnTDs3cgdyBqZWRuxIUgdGFiZWzEmQ0Ka29sZWpub3NjIDwtIGRhdGEuZnJhbWUoa29sZWpub3NjPWMoIlpBX1VXQUdJIiwiUlpfTkFaV0EiLCJaQV9ST19ST0siLCJaQV9UWVBFIiwiUlpfUk9EWkFKX0lEIiwiRFpfTkFaV0EiLCJEWl9EWklBTF9JRCIsIlRXX1RXT1JDQV9JRCIsIkFNX0FVVE9SX0lEIiwiQU1fTkFaV0lTS08iLCJBTV9JTUlFIiwiWkFfVFlUVUwiLCJaQV9UWVRVTF9PUllHSU5BTFUiLCJaQV9KRVpZS19PUllHSU5BTFUiLCJPU19PU09CQV9JRCIsIk9TX05BWldJU0tPIiwiT1NfSU1JRSIsImZvX3N5bWJvbCIsInphX29waXNfd3Nwb2x0d29yY293Iiwid3lkYW5pZSIsInphX3RvbXkiLCJpbnN0eXR1Y2phIiwiV1lfV1lEQVdOSUNUV09fSUQiLCJXWV9NSUFTVE8iLCJXWV9OQVpXQSIsInphX3Jva193eWRhbmlhIiwiemFfb3Bpc19rcyIsInNlcmlhIiwiVFdfTkFaV0lTS08iLCJUV19JTUlFIiwicmVkYWt0b3JfZHppYWx1IiwiWkFfQUROT1RBQ0pFIiwiQk5fVVJMIikpDQpwb2xhY3pvbmUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4scG9sYV9wYmwsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fYXV0b3IsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfdHl0dWwsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfdHl0dWxfb3J5Z2luYWx1LGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX2plenlrX29yeWdpbmFsdSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9vcGlzX3dzcG9sdHdvcmNvdyxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV93eWRhbmllLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX2luc3R5dHVjamEsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3lkYXduaWN0d28sYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfb3Bpc19rcyxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9zZXJpYV93eWRhd25pY3phLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3RvbXksYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfYWRub3RhY2plLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX1VSTCxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBzZWxlY3QoYXMudmVjdG9yKGtvbGVqbm9zYyRrb2xlam5vc2MpKQ0KY29sbmFtZXMocG9sYWN6b25lKSA8LSBjKCJyZWtvcmRfQk4iLCJyel9uYXp3YSIsInphX3JvX3JvayIsInphX3R5cGUiLCJyel9yb2R6YWpfaWQiLCJEWl9OQVpXQSIsIkRaX0RaSUFMX0lEIiwidHdfdHdvcmNhX2lkIiwiYW1fYXV0b3JfaWQiLCJhbV9uYXp3aXNrbyIsImFtX2ltaWUiLCJ6YV90eXR1bCIsInphX3R5dHVsX29yeWdpbmFsdSIsInphX2plenlrX29yeWdpbmFsdSIsIm9zX29zb2JhX2lkIiwib3NfbmF6d2lza28iLCJvc19pbWllIiwiZm9fc3ltYm9sIiwiemFfb3Bpc193c3BvbHR3b3Jjb3ciLCJ6YV93eWRhbmllIiwiemFfdG9teSIsInphX2luc3R5dHVjamEiLCJ3eV93eWRhd25pY3R3b19pZCIsInd5X21pZWpzY2UiLCJ3eV9uYXp3YSIsInphX3Jva193eWRhbmlhIiwiemFfb3Bpc19maXp5Y3pueV9rc2lhemtpIiwiemFfc2VyaWFfd3lkYXduaWN6YSIsInR3X25hendpc2tvIiwidHdfaW1pZSIsInByYWNvd25payIsInphX2Fkbm90YWNqZSIsIkJOX1VSTCIpDQoNCiN6YXN5Z25hbGl6b3dhbmllIG5pZXBvcHJhd25lZ28ga29kb3dhbmlhDQp4IDwtIDE6KGxlbmd0aChwb2xhY3pvbmUpLTIpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIHBvbGFjem9uZSR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGdyZXBsKCI8VVxcKyguLi4uKT4iLHBvbGFjem9uZVssaV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobmNoYXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkhPTAscGFzdGUocG9sYWN6b25lJHphX2Fkbm90YWNqZSxwYXN0ZSgiVVdBR0EhIELFgsSFZCBrb2Rvd2FuaWEgdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgWm5hamTFuiBmcmF6xJkgXCI/Pz9cIiBpIHpyZWRhZ3VqIHBvbGUiLHNlcCA9ICIiKSxzZXAgPSAiIyAiKSxwYXN0ZSgiVVdBR0EhIELFgsSFZCBrb2Rvd2FuaWEgdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgWm5hamTFuiBmcmF6xJkgXCI/Pz9cIiBpIHpyZWRhZ3VqIHBvbGUiLHNlcCA9ICIiKSksYXMuY2hhcmFjdGVyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpKQ0KICBwb2xhY3pvbmVbLGldIDwtIGdzdWIoIjxVXFwrKC4uLi4pPiIsICI/Pz8iLCBwb2xhY3pvbmVbLGldKQ0KfQ0KI3phc3lnbmFsaXpvd2FuaWUgb2JlY25vxZtjaSB6bmFrdSAkIHcga3TDs3J5bcWbIHogcMOzbA0KWCA8LSAxOihsZW5ndGgocG9sYWN6b25lKS0yKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiXFwkIixwb2xhY3pvbmVbLGldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5jaGFyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpPT0wLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gem5hayBcIiRcIi4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHBhc3RlKHBvbGFjem9uZSR6YV9hZG5vdGFjamUscGFzdGUoIlVXQUdBISBaZSB3emdsxJlkdSBuYSBixYLEmWRueSB6YXBpcyBCTiB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiB3eWRydWtvd2FubyB6bmFrIFwiJFwiLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksc2VwID0gIiMgIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCn0NCiN6YXN5Z25hbGl6b3dhbmllIG9iZWNub8WbY2kgZnJhenkgImNoYXJhY3RlcigwKSIgdyBrdMOzcnltxZsgeiBww7NsDQpYIDwtIDE6KGxlbmd0aChwb2xhY3pvbmUpLTIpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIHBvbGFjem9uZSR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGdyZXBsKCJjaGFyYWN0ZXJcXCgwXFwpIixwb2xhY3pvbmVbLGldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5jaGFyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpPT0wLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gZnJhesSZIFwiY2hhcmFjdGVyKDApXCIuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gZnJhesSZIFwiY2hhcmFjdGVyKDApXCIuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxzZXAgPSAiIyAiKSksYXMuY2hhcmFjdGVyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpKQ0KfQ0KI3phc3lnbmFsaXpvd2FuaWUgb2JlY25vxZtjaSB6bmFrdSAjIHcgb3Bpc2llIHdzcMOzxYJ0d8OzcmPDs3cNCnBvbGFjem9uZSR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGdyZXBsKCJcXCMiLHBvbGFjem9uZSR6YV9vcGlzX3dzcG9sdHdvcmNvdyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKT09MCwiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGtvbmZsaWt0IHcgb3Bpc2llIHdzcMOzxYJ0d8OzcmPDs3cgd3liaWVyeiB3xYJhxZtjaXfEhSB3YXJ0b8WbxIcgKHN0cmVmYSBvZHBvd2llZHppYWxub8WbY2kgXCIjXCIgd3Nww7PFgnR3w7NyY3kgeiBwb2xhIDcwMCkiLHBhc3RlKHBvbGFjem9uZSR6YV9hZG5vdGFjamUsIlVXQUdBISBaZSB3emdsxJlkdSBuYSBrb25mbGlrdCB3IG9waXNpZSB3c3DDs8WCdHfDs3Jjw7N3IHd5Ymllcnogd8WCYcWbY2l3xIUgd2FydG/Fm8SHIChzdHJlZmEgb2Rwb3dpZWR6aWFsbm/Fm2NpICMgd3Nww7PFgnR3w7NyY3kgeiBwb2xhIDcwMCkiLHNlcCA9ICIjICIpKSxhcy5jaGFyYWN0ZXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkpDQoNCm91dCA8LSBjU3BsaXQocG9sYWN6b25lLCBjKCJhbV9hdXRvcl9pZCIsICJhbV9uYXp3aXNrbyIsICJhbV9pbWllIiwib3Nfb3NvYmFfaWQiLCJvc19uYXp3aXNrbyIsICJvc19pbWllIiwgImZvX3N5bWJvbCIsInd5X3d5ZGF3bmljdHdvX2lkIiwid3lfbWllanNjZSIsInd5X25hendhIiksc2VwID0gInwiLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIHVuaXF1ZSgpDQoNCm91dCRyZWtvcmRfQk4gPC0gaWZlbHNlKGlzLm5hKG91dCRyZWtvcmRfQk4pLCcnLGFzLmNoYXJhY3RlcihvdXQkcmVrb3JkX0JOKSkNCm91dCRyel9uYXp3YSA8LSBpZmVsc2UoaXMubmEob3V0JHJ6X25hendhKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHJ6X25hendhKSkNCm91dCR6YV9yb19yb2sgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9yb19yb2spLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfcm9fcm9rKSkNCm91dCR6YV90eXBlIDwtIGlmZWxzZShpcy5uYShvdXQkemFfdHlwZSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90eXBlKSkNCm91dCRyel9yb2R6YWpfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCRyel9yb2R6YWpfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkcnpfcm9kemFqX2lkKSkNCm91dCREWl9OQVpXQSA8LSBpZmVsc2UoaXMubmEob3V0JERaX05BWldBKSwnJyxhcy5jaGFyYWN0ZXIob3V0JERaX05BWldBKSkNCm91dCREWl9EWklBTF9JRCA8LSBpZmVsc2UoaXMubmEob3V0JERaX0RaSUFMX0lEKSwnJyxhcy5jaGFyYWN0ZXIob3V0JERaX0RaSUFMX0lEKSkNCm91dCR0d190d29yY2FfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCR0d190d29yY2FfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkdHdfdHdvcmNhX2lkKSkNCm91dCRhbV9hdXRvcl9pZCA8LSBpZmVsc2UoaXMubmEob3V0JGFtX2F1dG9yX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGFtX2F1dG9yX2lkKSkNCm91dCRhbV9uYXp3aXNrbyA8LSBpZmVsc2UoaXMubmEob3V0JGFtX25hendpc2tvKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGFtX25hendpc2tvKSkNCm91dCRhbV9pbWllIDwtIGlmZWxzZShpcy5uYShvdXQkYW1faW1pZSksJycsYXMuY2hhcmFjdGVyKG91dCRhbV9pbWllKSkNCm91dCR6YV90eXR1bCA8LSBpZmVsc2UoaXMubmEob3V0JHphX3R5dHVsKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3R5dHVsKSkNCm91dCR6YV90eXR1bF9vcnlnaW5hbHUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90eXR1bF9vcnlnaW5hbHUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdHl0dWxfb3J5Z2luYWx1KSkNCm91dCR6YV9qZXp5a19vcnlnaW5hbHUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9qZXp5a19vcnlnaW5hbHUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfamV6eWtfb3J5Z2luYWx1KSkNCm91dCRvc19vc29iYV9pZCA8LSBpZmVsc2UoaXMubmEob3V0JG9zX29zb2JhX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JG9zX29zb2JhX2lkKSkNCm91dCRvc19uYXp3aXNrbyA8LSBpZmVsc2UoaXMubmEob3V0JG9zX25hendpc2tvKSwnJyxhcy5jaGFyYWN0ZXIob3V0JG9zX25hendpc2tvKSkNCm91dCRvc19pbWllIDwtIGlmZWxzZShpcy5uYShvdXQkb3NfaW1pZSksJycsYXMuY2hhcmFjdGVyKG91dCRvc19pbWllKSkNCm91dCRmb19zeW1ib2wgPC0gaWZlbHNlKGlzLm5hKG91dCRmb19zeW1ib2wpLCcnLGFzLmNoYXJhY3RlcihvdXQkZm9fc3ltYm9sKSkNCm91dCR6YV9vcGlzX3dzcG9sdHdvcmNvdyA8LSBpZmVsc2UoaXMubmEob3V0JHphX29waXNfd3Nwb2x0d29yY293KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX29waXNfd3Nwb2x0d29yY293KSkNCm91dCR6YV93eWRhbmllIDwtIGlmZWxzZShpcy5uYShvdXQkemFfd3lkYW5pZSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV93eWRhbmllKSkNCm91dCR6YV90b215IDwtIGlmZWxzZShpcy5uYShvdXQkemFfdG9teSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90b215KSkNCm91dCR6YV9pbnN0eXR1Y2phIDwtIGlmZWxzZShpcy5uYShvdXQkemFfaW5zdHl0dWNqYSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9pbnN0eXR1Y2phKSkNCm91dCR3eV93eWRhd25pY3R3b19pZCA8LSBpZmVsc2UoaXMubmEob3V0JHd5X3d5ZGF3bmljdHdvX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHd5X3d5ZGF3bmljdHdvX2lkKSkNCm91dCR3eV9taWVqc2NlIDwtIGlmZWxzZShpcy5uYShvdXQkd3lfbWllanNjZSksJycsYXMuY2hhcmFjdGVyKG91dCR3eV9taWVqc2NlKSkNCm91dCR3eV9uYXp3YSA8LSBpZmVsc2UoaXMubmEob3V0JHd5X25hendhKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHd5X25hendhKSkNCm91dCR6YV9yb2tfd3lkYW5pYSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3Jva193eWRhbmlhKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3Jva193eWRhbmlhKSkNCm91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2kgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2kpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfb3Bpc19maXp5Y3pueV9rc2lhemtpKSkNCm91dCR6YV9zZXJpYV93eWRhd25pY3phIDwtIGlmZWxzZShpcy5uYShvdXQkemFfc2VyaWFfd3lkYXduaWN6YSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9zZXJpYV93eWRhd25pY3phKSkNCm91dCR0d19uYXp3aXNrbyA8LSBpZmVsc2UoaXMubmEob3V0JHR3X25hendpc2tvKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHR3X25hendpc2tvKSkNCm91dCR0d19pbWllIDwtIGlmZWxzZShpcy5uYShvdXQkdHdfaW1pZSksJycsYXMuY2hhcmFjdGVyKG91dCR0d19pbWllKSkNCm91dCRwcmFjb3duaWsgPC0gaWZlbHNlKGlzLm5hKG91dCRwcmFjb3duaWspLCcnLGFzLmNoYXJhY3RlcihvdXQkcHJhY293bmlrKSkNCm91dCR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9hZG5vdGFjamUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfYWRub3RhY2plKSkNCm91dCRCTl9VUkwgPC0gaWZlbHNlKGlzLm5hKG91dCRCTl9VUkwpLCcnLGFzLmNoYXJhY3RlcihvdXQkQk5fVVJMKSkNCg0Kb3V0ICUkJSAgDQogICAgeyByZWtvcmRfQk49PWxhZyhyZWtvcmRfQk4sKSAmIHJ6X25hendhPT1sYWcocnpfbmF6d2EsKSAmIHphX3JvX3Jvaz09bGFnKHphX3JvX3JvaywpICYgemFfdHlwZT09bGFnKHphX3R5cGUsKSAmIHJ6X3JvZHphal9pZD09bGFnKHJ6X3JvZHphal9pZCwpICYgRFpfTkFaV0E9PWxhZyhEWl9OQVpXQSwpICYgRFpfRFpJQUxfSUQ9PWxhZyhEWl9EWklBTF9JRCwpICYgdHdfdHdvcmNhX2lkPT1sYWcodHdfdHdvcmNhX2lkLCkgJiB6YV90eXR1bD09bGFnKHphX3R5dHVsLCkgJiB6YV90eXR1bF9vcnlnaW5hbHU9PWxhZyh6YV90eXR1bF9vcnlnaW5hbHUsKSAmIHphX2plenlrX29yeWdpbmFsdT09bGFnKHphX2plenlrX29yeWdpbmFsdSwpICYgemFfb3Bpc193c3BvbHR3b3Jjb3c9PWxhZyh6YV9vcGlzX3dzcG9sdHdvcmNvdywpICYgemFfd3lkYW5pZT09bGFnKHphX3d5ZGFuaWUsKSAmIHphX3RvbXk9PWxhZyh6YV90b215LCkgJiB6YV9pbnN0eXR1Y2phPT1sYWcoemFfaW5zdHl0dWNqYSwpICYgemFfcm9rX3d5ZGFuaWE9PWxhZyh6YV9yb2tfd3lkYW5pYSwpICYgemFfb3Bpc19maXp5Y3pueV9rc2lhemtpPT1sYWcoemFfb3Bpc19maXp5Y3pueV9rc2lhemtpLCkgJiB6YV9zZXJpYV93eWRhd25pY3phPT1sYWcoemFfc2VyaWFfd3lkYXduaWN6YSwpICYgdHdfbmF6d2lza289PWxhZyh0d19uYXp3aXNrbywpICYgdHdfaW1pZT09bGFnKHR3X2ltaWUsKSAmIHByYWNvd25paz09bGFnKHByYWNvd25paywpICYgemFfYWRub3RhY2plPT1sYWcoemFfYWRub3RhY2plLCkgJiBCTl9VUkw9PWxhZyhCTl9VUkwsKX0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IG91dCRzYW1lDQpvdXQkc2FtZVsxXSA8LSAwDQpvdXQkZHppZWxvbmUgPC0gcGFzdGUob3V0JGFtX2F1dG9yX2lkLG91dCRhbV9uYXp3aXNrbyxvdXQkYW1faW1pZSxvdXQkb3Nfb3NvYmFfaWQsb3V0JG9zX25hendpc2tvLG91dCRvc19pbWllLG91dCRmb19zeW1ib2wsb3V0JHd5X3d5ZGF3bmljdHdvX2lkLG91dCR3eV9taWVqc2NlLG91dCR3eV9uYXp3YSxzZXAgPSAiIikNCg0Kb3V0IDwtIG91dCAlPiUNCiAgZmlsdGVyKCEoc2FtZT09MSZkemllbG9uZT09IiIpKSAlPiUNCiAgc2VsZWN0KDE6MzMpDQoNCm91dCAlJCUgIA0KICAgIHsgcmVrb3JkX0JOPT1sYWcocmVrb3JkX0JOLCkgJiByel9uYXp3YT09bGFnKHJ6X25hendhLCkgJiB6YV9yb19yb2s9PWxhZyh6YV9yb19yb2ssKSAmIHphX3R5cGU9PWxhZyh6YV90eXBlLCkgJiByel9yb2R6YWpfaWQ9PWxhZyhyel9yb2R6YWpfaWQsKSAmIERaX05BWldBPT1sYWcoRFpfTkFaV0EsKSAmIERaX0RaSUFMX0lEPT1sYWcoRFpfRFpJQUxfSUQsKSAmIHR3X3R3b3JjYV9pZD09bGFnKHR3X3R3b3JjYV9pZCwpICYgemFfdHl0dWw9PWxhZyh6YV90eXR1bCwpICYgemFfdHl0dWxfb3J5Z2luYWx1PT1sYWcoemFfdHl0dWxfb3J5Z2luYWx1LCkgJiB6YV9qZXp5a19vcnlnaW5hbHU9PWxhZyh6YV9qZXp5a19vcnlnaW5hbHUsKSAmIHphX29waXNfd3Nwb2x0d29yY293PT1sYWcoemFfb3Bpc193c3BvbHR3b3Jjb3csKSAmIHphX3d5ZGFuaWU9PWxhZyh6YV93eWRhbmllLCkgJiB6YV90b215PT1sYWcoemFfdG9teSwpICYgemFfaW5zdHl0dWNqYT09bGFnKHphX2luc3R5dHVjamEsKSAmIHphX3Jva193eWRhbmlhPT1sYWcoemFfcm9rX3d5ZGFuaWEsKSAmIHphX29waXNfZml6eWN6bnlfa3NpYXpraT09bGFnKHphX29waXNfZml6eWN6bnlfa3NpYXpraSwpICYgemFfc2VyaWFfd3lkYXduaWN6YT09bGFnKHphX3NlcmlhX3d5ZGF3bmljemEsKSAmIHR3X25hendpc2tvPT1sYWcodHdfbmF6d2lza28sKSAmIHR3X2ltaWU9PWxhZyh0d19pbWllLCkgJiBwcmFjb3duaWs9PWxhZyhwcmFjb3duaWssKSAmIHphX2Fkbm90YWNqZT09bGFnKHphX2Fkbm90YWNqZSwpICYgQk5fVVJMPT1sYWcoQk5fVVJMLCl9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiBvdXQkc2FtZQ0KDQojdWNpxJljaWUgemJ5dCBkxYJ1Z2ljaCBjacSFZ8OzdyB6bmFrw7N3LCBieSB3ZXN6xYJ5IGRvIG9yYWNsZSdhDQpkbHVnb3NjaSA8LSBkYXRhLmZyYW1lKHBvbGUgPSBjKCJhbV9uYXp3aXNrbyIsICJhbV9pbWllIiwgInphX3R5dHVsIiwgInphX3R5dHVsX29yeWdpbmFsdSIsICJ6YV9qZXp5a19vcnlnaW5hbHUiLCAib3NfbmF6d2lza28iLCAib3NfaW1pZSIsICJ6YV9vcGlzX3dzcG9sdHdvcmNvdyIsICJ6YV9pbnN0eXR1Y2phIiwgInd5X21pZWpzY2UiLCAid3lfbmF6d2EiLCAiemFfb3Bpc19maXp5Y3pueV9rc2lhemtpIiwgInphX3NlcmlhX3d5ZGF3bmljemEiLCAidHdfbmF6d2lza28iLCAidHdfaW1pZSIsICJ6YV9hZG5vdGFjamUiKSwgbGljemJhX3puYWtvdyA9IGMoNTAsNDAsNTAwLDUwMCwxMDAsNTAsNDAsNTAwLDI1NSw0MCwyNTUsMTAwMCwyNTUsMjAwLDQwLDIwMDApKQ0KeCA8LSBtYXRjaChkbHVnb3NjaSRwb2xlLG5hbWVzKG91dCkpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIGRsdWdvc2MgPC0gZGx1Z29zY2kkbGljemJhX3puYWtvd1ttYXRjaChuYW1lcyhvdXRbaV0pLGRsdWdvc2NpJHBvbGUpXQ0KICBvdXQkemFfYWRub3RhY2plIDwtIGlmZWxzZShkbHVnb3NjPG5jaGFyKGFzLmNoYXJhY3RlcihvdXRbLGldKSkmb3V0JHphX2Fkbm90YWNqZSE9IiIscGFzdGUob3V0JHphX2Fkbm90YWNqZSxwYXN0ZSgiVVdBR0EhIFBvbGUgIixhcy5jaGFyYWN0ZXIobmFtZXMob3V0W2ldKSksIiBiecWCbyB6Ynl0IGTFgnVnaWUgaSB6b3N0YcWCbyBwcnp5Y2nEmXRlLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksc2VwID0gIiMgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkbHVnb3NjPG5jaGFyKGFzLmNoYXJhY3RlcihvdXRbLGldKSkmb3V0JHphX2Fkbm90YWNqZT09IiIscGFzdGUoIlVXQUdBISBQb2xlICIsYXMuY2hhcmFjdGVyKG5hbWVzKG91dFtpXSkpLCIgYnnFgm8gemJ5dCBkxYJ1Z2llIGkgem9zdGHFgm8gcHJ6eWNpxJl0ZS4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLGFzLmNoYXJhY3RlcihvdXQkemFfYWRub3RhY2plKSkpDQogIA0KICBvdXRbLGldIDwtIGlmZWxzZShkbHVnb3NjPG5jaGFyKGFzLmNoYXJhY3RlcihvdXRbLGldKSksYXMuY2hhcmFjdGVyKHN1YnN0cihvdXRbLGldLDEsZGx1Z29zYykpLGFzLmNoYXJhY3RlcihvdXRbLGldKSkNCn0NCg0Kb3V0JHJla29yZF9CTltvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHJ6X25hendhW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfcm9fcm9rW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdHlwZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHJ6X3JvZHphal9pZFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JERaX05BWldBW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkRFpfRFpJQUxfSURbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR0d190d29yY2FfaWRbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90eXR1bFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3R5dHVsX29yeWdpbmFsdVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX2plenlrX29yeWdpbmFsdVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX29waXNfd3Nwb2x0d29yY293W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfd3lkYW5pZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3RvbXlbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9pbnN0eXR1Y2phW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfcm9rX3d5ZGFuaWFbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2lbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9zZXJpYV93eWRhd25pY3phW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkdHdfbmF6d2lza29bb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR0d19pbWllW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkcHJhY293bmlrW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfYWRub3RhY2plW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkQk5fVVJMW291dCRzYW1lID09IDFdIDwtICIiDQoNCm91dCA8LSBvdXQgJT4lDQogIHNlbGVjdCgxOjMzKQ0KDQojcMSZdGxhIHphcGlzdWrEhWNhIHBvIG9rLiAyMDAwIHdpZXJzenkgeiB1d3pnbMSZZG5pZW5pZW0ga29tcGxldG5vxZtjaSByZWtvcmTDs3cgYmlibGlvZ3JhZmljem55Y2ggcm96cGlzYW55Y2ggbmEga2lsa2Egd2llcnN6eQ0Kb3V0IDwtIG91dCAlPiUNCiAgbXV0YXRlKHBvZHppYWwgPSBpZmVsc2UocmVrb3JkX0JOIT0iIixhcy5jaGFyYWN0ZXIocmVrb3JkX0JOKSxOQSkpICU+JQ0KICBmaWxsKHBvZHppYWwpDQppbGUgPC0gdW5pcXVlKG91dCRwb2R6aWFsKQ0KaWxlIDwtIHNwbGl0KHVuaXF1ZShpbGUpLCBjZWlsaW5nKHNlcV9hbG9uZyh1bmlxdWUoaWxlKSkvMTUwMCkpDQojYWt0dWFsaXphY2phIC0gd3Bpc3ogd8WCYcWbY2l3eSByb2sgdyDFm2NpZcW8a8SZIHBsaWt1DQp4IDwtIDE6bGVuZ3RoKGlsZSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgZmluYWwgPC0gb3V0ICU+JQ0KICAgIGZpbHRlcihwb2R6aWFsICVpbiUgaWxlW1tpXV0pICU+JQ0KICAgIHNlbGVjdCgtcG9kemlhbCkNCiAgd3JpdGUueGxzeChmaW5hbCwgcGFzdGUoIkM6L1VzZXJzL0NlemFyeS9EZXNrdG9wLzIwMTFfcHJ6ZWRtaW90b3dhX2RvX2ltcG9ydHUiLGksIi54bHN4IixzZXAgPSAiIiksc2hlZXROYW1lID0gImdvdG93ZSIpDQp9DQpgYGANCg0KYGBge3Iga3NpxIXFvGtpIGFudG9sb2dpZX0NCmJuX29rIDwtIGNodW5rMTENCmRhdGEgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09ImFudG9sb2dpYSIpICU+JQ0KICBtdXRhdGUocmVkYWt0b3JfZHppYWx1ID0gcGFzdGUocmVkYWt0b3JfZHppYWx1LCJfYW50IixzZXAgPSAiIikpDQojdXdvbG5pZW5pZSBrb2x1bW4geiBkYW55bWkgeiBibiBpIHByemV0d29yemVuaWUgZG8gUEJMDQojMTogemFfdXdhZ2ksIHJ6X25hendhLCB6YV9yb19yb2ssIHphX3R5cGUsIHJ6X3JvZHphal9pZCwgdHdfdHdvcmNhX2lkLCB0d19uYXp3aXNrbywgdHdfaW1pZSwgZHpfZHppYWxfaWQsIGR6X25hendhLCByZWRha3Rvcl9kemlhbHUNCnBvbGFfcGJsIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSwgUlpfTkFaV0EsIFpBX1JPX1JPSyA9IHJvaywgUlpfUk9EWkFKX0lELCBUV19UV09SQ0FfSUQsIFRXX05BWldJU0tPLCBUV19JTUlFLCBEWl9EWklBTF9JRCwgRFpfTkFaV0EsIHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIG11dGF0ZShaQV9UWVBFID0gIktTIikNCiMyOiBhdXRvcg0KQk5fYXV0b3IgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKEFNX0FVVE9SX0lEID0gTkEsDQogICAgICAgICBBTV9OQVpXSVNLTyA9IE5BLA0KICAgICAgICAgQU1fSU1JRSA9IE5BKQ0KDQojYWRub3RhY2plIHogYXV0b3LDs3cNCiN3IGFudG9sb2dpaSBhZG5vdGFjamEgbXVzaSBiecSHIHdjemXFm25pZWosIMW8ZWJ5IG5hIGfDs3J6ZSBiecWCbyBpbmZvIG8gdGVrc3RhY2ggYXV0b3LDs3cNCg0KWkFfQUROT1RBQ0pFIDwtIGRhdGEgJT4lDQogIHNlbGVjdChYMTAwLFgyNDUsWkFfVVdBR0kpDQojcG9sZSAxMDANCm1hcmNfZmllbGRfMTAwIDwtIFpBX0FETk9UQUNKRSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgxMDApJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgxMDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVtb3ZlX2FsbChYMTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgxMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoWkFfQUROT1RBQ0pFJFgxMDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8xMDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMTAwPC1jYmluZChtYXJjX2ZpZWxkXzEwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzEwMCRYMTAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMTAwJFgxMDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMTAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMTAwJFgxMDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzEwMCRYMTAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCiN0dXRhaiBtb8W8ZSBiecSHIGLFgsSFZCB6ZSB3emdsxJlkdSBuYSBicmFrIGtvbHVtbnkgJGIsIHd0ZWR5IG5hbGXFvHkgem1pZW5pxIcgbGluacSZIHogc2VsZWN0ZW0gaSB6YWtvbWVudG93YcSHIGxpbmnEmTogbXV0YXRlKGAkYWAgPSBpZmVsc2UoIWlzLm5hKGAkYmApLHBhc3RlKGAkYWAsYCRiYCxzZXAgPSAiICIpLGFzLmNoYXJhY3RlcihgJGFgKSkpICU+JQ0KWkFfQUROT1RBQ0pFIDwtIG1hcmNfZmllbGRfMTAwICU+JQ0KICAjc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogICNtdXRhdGUoYCRhYCA9IGlmZWxzZSghaXMubmEoYCRiYCkscGFzdGUoYCRhYCxgJGJgLHNlcCA9ICIgIiksYXMuY2hhcmFjdGVyKGAkYWApKSkgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShBTV9OQVpXSVNLTyA9IGlmZWxzZShncmVwbCgiXFx8IixgJGFgKSwgc3RyX3JlcGxhY2VfYWxsKHN0cl9yZW1vdmVfYWxsKGAkYWAsIiwiKSwiXFx8IiwiLCAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiLCIsYCRhYCksc3RyX3JlcGxhY2VfYWxsKGAkYWAsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoYCRhYCkpKSwNCiAgICAgICAgIEFNX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIlxcfCIsYCRhYCksIioiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIiwiLGAkYWApLHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSkgJT4lDQogIHVuaXRlKCJaQV9BRE5PVEFDSkUiLCBBTV9JTUlFOkFNX05BWldJU0tPLCBzZXAgPSAiICIpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBwYXN0ZSgiW1Rla3N0eSBhdXQuOl0iLHBhc3RlKFpBX0FETk9UQUNKRSxjb2xsYXBzZSA9ICIsICIpLHNlcCA9ICIgIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMzogdHl0dcWCDQojcG9sZSAyNDUNCm1hcmNfZmllbGRfMjQ1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJ+IiksDQogICAgICAgICBYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzI0NSA8LSBtYXJjX2ZpZWxkXzI0NSAlPiUNCiBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGJgLGAkbmAsYCRwYCkgJT4lDQogZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICBgJGJgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYmApLCIiLGFzLmNoYXJhY3RlcihgJGJgKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICBgJG5gID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkbmApLCIiLGFzLmNoYXJhY3RlcihgJG5gKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICBgJHBgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkcGApLCIiLGFzLmNoYXJhY3RlcihgJHBgKSksY29sbGFwc2UgPSAiICIpKSAlPiUNCiB1bmdyb3VwKCkgJT4lDQogdW5pcXVlKCkgJT4lDQogdW5pdGUoIlpBX1RZVFVMIixgJGFgOmAkcGAsc2VwID0gIiAiLG5hLnJtID0gVFJVRSkgJT4lDQogbXV0YXRlKFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCIgKyIsIiAiKSwNCiAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVtb3ZlKFpBX1RZVFVMLCAiXFxzK1xcL1xcc3swLH0kIiksDQogICAgICAgIFpBX1RZVFVMID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLGFzLmNoYXJhY3RlcihaQV9UWVRVTCkpKSkpLA0KICAgICAgICBaQV9UWVRVTCA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSxhcy5jaGFyYWN0ZXIoWkFfVFlUVUwpKSkpKSwNCiAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVwbGFjZV9hbGwoWkFfVFlUVUwsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgIFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCIgOyAiLCIuICIpLA0KICAgICAgICBaQV9UWVRVTCA9IGdzdWIoIiggOiApKC4pIiwiLiBcXFVcXDIiLHBlcmw9VFJVRSxaQV9UWVRVTCkpICU+JQ0KIHNlbGVjdChaQV9VV0FHSSxaQV9UWVRVTCkNCiNkb3Bpc2FuaWUgZ2F0dW5rdSBkbyBwcnplZG1pb3Rvd2VqIG5hIHBvZHN0YXdpZSA2NTUgaSA2NTAgIA0KZ2F0dW5raV9wYmwgPC0gZGF0YS5mcmFtZShnYXR1bmVrID0gYygiYWZvcnl6bSIsICJhbGJ1bSIsICJhbnRvbG9naWEiLCAiYXV0b2Jpb2dyYWZpYSIsICJkemllbm5payIsICJlc2VqIiwgImZlbGlldG9uIiwgImlubmUiLCAia2F6YW5pZSIsICJsaXN0IiwgIm1pbmlhdHVyYSBwcm96xIUiLCAib3Bvd2lhZGFuaWUiLCAicG9lbWF0IiwgInBvd2llxZvEhyIsICJwcm96YSIsICJwcm96YSBwb2V0eWNrYSIsICJyZXBvcnRhxbwiLCAicm96bXnFm2xhbmllIHJlbGlnaWpuZSIsICJyeXN1bmVrLCBvYnJheiIsICJzY2VuYXJpdXN6IiwgInN6a2ljIiwgInRla3N0IGJpYmxpam55IiwgInRla3N0IGRyYW1hdHljem55IiwgImRyYW1hdCIsICJ3aWVyc3oiLCAid3Nwb21uaWVuaWEiLCAid3lwb3dpZWTFuiIsICJwYW1pxJl0bmlraSIsICJwb2V6amEiLCAibGl0ZXJhdHVyYSBwb2Ryw7PFvG5pY3phIiwgInNhdHlyYSIsICJwaW9zZW5rYSIpKQ0KDQojZHJhbWF0LCBwYW1pxJl0bmlraSwgcG9lemphLCBsaXRlcmF0dXJhIHBvZHLDs8W8bmljemEsIHNhdHlyYSwgcGlvc2Vua2ENCmdhdHVua2lfYm4gPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg2NTUsWDY1MCkNCg0KZ2F0dW5raV9ibiA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgZnJvbSBnYXR1bmtpX2JuDQogICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBnYXR1bmtpX3BibCBvbiBsb3dlcihnYXR1bmtpX2JuLlg2NTUpIGxpa2UgJyUnfHxnYXR1bmtpX3BibC5nYXR1bmVrfHwnJSciKQ0KZ2F0dW5raV9ibiA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICBmcm9tIGdhdHVua2lfYm4NCiAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gZ2F0dW5raV9wYmwgb24gbG93ZXIoZ2F0dW5raV9ibi5YNjUwKSBsaWtlICclJ3x8Z2F0dW5raV9wYmwuZ2F0dW5la3x8JyUnIikNCmNvbG5hbWVzKGdhdHVua2lfYm4pWzVdIDwtICJnYXR1bmVrMiINCmdhdHVua2lfYm4gPC0gZ2F0dW5raV9ibiAlPiUNCiAgbXV0YXRlKGdhdHVuZWsgPSBpZmVsc2UoaXMubmEoZ2F0dW5laykmIWlzLm5hKGdhdHVuZWsyKSxhcy5jaGFyYWN0ZXIoZ2F0dW5lazIpLGFzLmNoYXJhY3RlcihnYXR1bmVrKSkpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGdhdHVuZWspKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGdhdHVuZWspICU+JQ0KICBtdXRhdGUoZ2F0dW5layA9IGlmZWxzZShnYXR1bmVrPT0iZHJhbWF0IiwidGVrc3QgZHJhbWF0eWN6bnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2F0dW5laz09InBhbWnEmXRuaWtpIiwid3Nwb21uaWVuaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdhdHVuZWs9PSJwb2V6amEiLCJ3aWVyc3oiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnYXR1bmVrPT0ibGl0ZXJhdHVyYSBwb2Ryw7PFvG5pY3phIiwicmVwb3J0YcW8IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdhdHVuZWs9PSJwaW9zZW5rYSIsIndpZXJzeiIsYXMuY2hhcmFjdGVyKGdhdHVuZWspKSkpKSkpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShnYXR1bmVrID0gcGFzdGUoZ2F0dW5layxjb2xsYXBzZSA9ICIsICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKGdhdHVuZWsgPSBnc3ViKCIoXi4pIiwiXFxVXFwxIixwZXJsID0gVFJVRSwgZ2F0dW5laykpDQojcG/FgsSFY3plbmllIHR5dHXFgnUgeiBnYXR1bmtpZW0NCnphX3R5dHVsIDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBsZWZ0X2pvaW4oLixnYXR1bmtpX2JuLGJ5PSJaQV9VV0FHSSIpICU+JSANCiAgbXV0YXRlKGdhdHVuZWsgPSBwYXN0ZSgiWyIsZ2F0dW5laywiXSIsc2VwID0gIiIpLA0KICAgICAgICAgZ2F0dW5layA9IGlmZWxzZShnYXR1bmVrPT0iW05BXSIsTkEsYXMuY2hhcmFjdGVyKGdhdHVuZWspKSkgJT4lIA0KICB1bml0ZSgiWkFfVFlUVUwiLCBaQV9UWVRVTDpnYXR1bmVrLCBzZXAgPSAiLiAiLG5hLnJtPVRSVUUpICU+JSANCiAgbXV0YXRlKFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCJcXC4gXFwuIiwiLiAiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gc3RyX3JlcGxhY2UoWkFfVFlUVUwsIihcXCEpKFxcLil8KFxcPykoXFwuKSIsIlxcMSIpKQ0KIzQ6IHR5dHXFgiBvcnlnaW5hxYJ1DQojcG9sZSAyNDYNCm1hcmNfZmllbGRfMjQ2IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ2KSU+JQ0KICBmaWx0ZXIoWDI0NiE9IiIpICU+JQ0KICBtdXRhdGUoWDI0Nj1zdHJfcmVtb3ZlX2FsbChYMjQ2LCJ+IiksDQogICAgICAgICBYMjQ2PXN0cl9yZXBsYWNlX2FsbChYMjQ2LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDYiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NiE9IiIpICU+JQ0KICBtdXRhdGUoWDI0Nj1zdHJfcmVtb3ZlX2FsbChYMjQ2LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDYsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ2LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ2KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NjwtY2JpbmQobWFyY19maWVsZF8yNDYsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDYkWDI0NiA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NiRYMjQ2LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NlssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NiRYMjQ2KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDYkWDI0NiksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzI0NiA8LSBtYXJjX2ZpZWxkXzI0NiAlPiUNCiBmaWx0ZXIoZ3JlcGwoIm9yeWciLFgyNDYpKSAlPiUNCiBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGJgLGAkbmAsYCRwYCkgJT4lDQogZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiLCAiKSwNCiAgICAgICAgYCRiYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGJgKSwiIixhcy5jaGFyYWN0ZXIoYCRiYCkpLGNvbGxhcHNlID0gIiIpLA0KICAgICAgICBgJG5gID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkbmApLCIiLGFzLmNoYXJhY3RlcihgJG5gKSksY29sbGFwc2UgPSAiIiksDQogICAgICAgIGAkcGAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRwYCksIiIsYXMuY2hhcmFjdGVyKGAkcGApKSxjb2xsYXBzZSA9ICIiKSkgJT4lDQogdW5ncm91cCgpICU+JQ0KIHVuaXF1ZSgpICU+JQ0KIHVuaXRlKCJYMjQ2IixgJGFgOmAkcGAsc2VwID0gIiAiLG5hLnJtID0gVFJVRSkgJT4lDQogbXV0YXRlKFgyNDYgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiICsiLCIgIiksDQogICAgICAgIFgyNDYgPSBzdHJfcmVtb3ZlKFgyNDYsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgWDI0NiA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICBYMjQ2ID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICBYMjQ2ID0gc3RyX3JlcGxhY2VfYWxsKFgyNDYsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgIFgyNDYgPSBnc3ViKCIoIDogKSguKSIsIi4gXFxVXFwyIixwZXJsPVRSVUUsWDI0NikpICU+JQ0KIHNlbGVjdChaQV9VV0FHSSwgWDI0NikNCg0KI3BvbGUgNTAwDQptYXJjX2ZpZWxkXzUwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDUwMCklPiUNCiAgZmlsdGVyKFg1MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDA9c3RyX3JlbW92ZV9hbGwoWDUwMCwifiIpLA0KICAgICAgICAgWDUwMD1zdHJfcmVwbGFjZV9hbGwoWDUwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNTAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg1MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDA9c3RyX3JlbW92ZV9hbGwoWDUwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNTAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDUwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzUwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF81MDA8LWNiaW5kKG1hcmNfZmllbGRfNTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNTAwJFg1MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF81MDAkWDUwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF81MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF81MDAkWDUwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNTAwJFg1MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfNTAwIDwtIG1hcmNfZmllbGRfNTAwICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIm9yeWdcXC5cXDoiLFg1MDApKSAlPiUNCiAgbXV0YXRlKFg1MDAgPSBzdHJfcmVtb3ZlKGAkYWAsIl5UeXRcXC4gb3J5Z1xcLjogfF5UeXRcXCwgb3J5Z1xcLjogfF4uKj90eXRcXC4gb3J5Z1xcLjogIiksDQogICAgICAgICBYNTAwID0gc3RyX3JlbW92ZShYNTAwLCAiXFxzK1xcL1xcc3swLH0kIiksDQogICAgICAgICBYNTAwID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFg1MDApLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSxhcy5jaGFyYWN0ZXIoWDUwMCkpKSkpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDUwMCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDUwMCksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixYNTAwKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWDUwMCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDUwMCksYXMuY2hhcmFjdGVyKFg1MDApKSkpKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVwbGFjZV9hbGwoWDUwMCwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVtb3ZlKFg1MDAsICJcXC4kIiksDQogICAgICAgICBYNTAwID0gc3RyX3JlbW92ZShYNTAwLCIoLHswLDF9IHswLDF9KVxcZHs0fS4qJHwoLCB0fC4gVCl5dC4gb3J5Zy4gY3lrbHU6IikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDUwMCkNCiN0eXR1xYIgb3J5Z2luYcWCdQ0KemFfdHl0dWxfb3J5Z2luYWx1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMjQ2LGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzUwMCxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKFg1MDAgPSBpZmVsc2UoaXMubmEoWDUwMCksTkEsDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgib3J5ZyIsWDUwMCksTkEsYXMuY2hhcmFjdGVyKFg1MDApKSksDQogICAgICAgICBYNTAwID0gaWZlbHNlKCFpcy5uYShYNTAwKSZncmVwbCgiXFwuIC0gIixYNTAwKSxzdHJfcmVwbGFjZShYNTAwLCIoLio/KShcXC4gLSAuKiQpIiwiXFwxIiksYXMuY2hhcmFjdGVyKFg1MDApKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoIWlzLm5hKFg1MDApJmdyZXBsKCJOYSBrc2nEhcW8Y2UgcHNldWQiLFg1MDApLHN0cl9yZXBsYWNlKFg1MDAsIiguKj8pKFxcLiBOYSBrc2nEhcW8Y2UgcHNldWQuKiQpIiwiXFwxIiksYXMuY2hhcmFjdGVyKFg1MDApKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoIWlzLm5hKFg1MDApJmdyZXBsKCJQcnpla8WCXFwuIHdnIixYNTAwKSxzdHJfcmVwbGFjZShYNTAwLCIoLio/KShcXC4gUHJ6ZWvFglxcLiB3Zy4qJCkiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoWDUwMCkpLA0KICAgICAgICAgWkFfVFlUVUxfT1JZR0lOQUxVID0gaWZlbHNlKGlzLm5hKFgyNDYpJmlzLm5hKFg1MDApLE5BLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSghaXMubmEoWDUwMCksYXMuY2hhcmFjdGVyKFg1MDApLGFzLmNoYXJhY3RlcihYMjQ2KSkpLA0KICAgICAgICAgWkFfVFlUVUxfT1JZR0lOQUxVID0gc3RyX3JlbW92ZV9hbGwoWkFfVFlUVUxfT1JZR0lOQUxVLCdcXCInKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxaQV9UWVRVTF9PUllHSU5BTFUpDQoNCiM1OiBqxJl6eWsgb3J5Z2luYcWCdQ0KbWFyY19maWVsZF8wNDEgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgwNDEpJT4lDQogIGZpbHRlcihYMDQxIT0iIikgJT4lDQogIG11dGF0ZShYMDQxPXN0cl9yZXBsYWNlX2FsbChYMDQxLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgwNDEiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDA0MSE9IiIpICU+JQ0KICBtdXRhdGUoWDA0MT1zdHJfcmVtb3ZlX2FsbChYMDQxLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgwNDEsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMDQxLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMDQxKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzA0MTwtY2JpbmQobWFyY19maWVsZF8wNDEsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8wNDEkWDA0MSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzA0MSRYMDQxLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzA0MVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzA0MSRYMDQxKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8wNDEkWDA0MSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KemFfamV6eWtfb3J5Z2luYWx1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMDQxICU+JSBzZWxlY3QoWkFfVVdBR0ksWkFfSkVaWUtfT1JZR0lOQUxVID0gYCRhYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShaQV9KRVpZS19PUllHSU5BTFUgPSBzdHJfcmVwbGFjZV9hbGwoWkFfSkVaWUtfT1JZR0lOQUxVLCJcXCRhIiwiLCIpKSAlPiUNCiAgdW5pcXVlKCkNCg0KIzY6IHdzcMOzxYJ0d8OzcmN5DQptYXJjX2ZpZWxkXzcwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDcwMCklPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIiguLlxcJGEpIiwifFxcMSIpLA0KICAgICAgICAgWDcwMD1zdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNzAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlbW92ZV9hbGwoWDcwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpICU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDcwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzcwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF83MDA8LWNiaW5kKG1hcmNfZmllbGRfNzAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNzAwJFg3MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF83MDAkWDcwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF83MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF83MDAkWDcwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNzAwJFg3MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gbWFyY19maWVsZF83MDAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvc29iYSA9IGAkYWAsZnVua2NqYSA9IGAkZWApICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGZ1bmtjamEpKSAlPiUNCiAgbXV0YXRlKG9zb2JhID0gc3RyX3JlbW92ZShvc29iYSwiKD88PVthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiKSwNCiAgICAgICAgIE9TX05BWldJU0tPID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwxIiksYXMuY2hhcmFjdGVyKG9zb2JhKSksDQogICAgICAgICBPU19JTUlFID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSwNCiAgICAgICAgIHdzX3Byb3N0eSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIob3NvYmEpLCAiXFxXIiwgIiIpLA0KICAgICAgICAgZnVfcHJvc3RhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihmdW5rY2phKSwgIlxcVyIsICIiKSkgJT4lDQogIGxlZnRfam9pbiguLFBCTF93c3BvbHR3b3JjeSAlPiUgc2VsZWN0KE9TX09TT0JBX0lELE9TX0xJQ1pCQV9aQVBJU09XLG5hendhX3Byb3N0YSksYnk9Yygid3NfcHJvc3R5Ij0ibmF6d2FfcHJvc3RhIikpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLE9TX05BWldJU0tPLE9TX0lNSUUsLU9TX0xJQ1pCQV9aQVBJU09XKQ0KQk5fd3Nwb2x0d29yY2EkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX3dzcG9sdHdvcmNhWzE6Ml0pKQ0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2FbIWR1cGxpY2F0ZWQoQk5fd3Nwb2x0d29yY2EkaWRfZ3J1cHkpLF0gJT4lDQogIGxlZnRfam9pbiguLFBCTF9mdW5rY2plLGJ5PWMoImZ1X3Byb3N0YSI9Im5hendhIikpICU+JQ0KICBtdXRhdGUoZm9fc3ltYm9sID0gaWZlbHNlKGZvX3N5bWJvbD09Ik5VTEwiLE5BLGFzLmNoYXJhY3Rlcihmb19zeW1ib2wpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phKQ0KDQojdHV0YWogcHJ6ZXN6dWthxIcgWDI0NSBpIHpuYWxlxbrEhyBixYLEmWR5IHdzcMOzxYJ0d8OzcmPDs3cNCm1hcmNfZmllbGRfMjQ1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJ+IiksDQogICAgICAgICBYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8yNDUgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1Yz1gJGNgKQ0KDQpCTl93c3BvbHR3b3JjYSA8LSBCTl93c3BvbHR3b3JjYSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8yNDUsYnk9IlpBX1VXQUdJIikNCg0KeCA8LSAxOmxlbmd0aHMoQk5fd3Nwb2x0d29yY2FbMV0pDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBCTl93c3BvbHR3b3JjYSRjenlfbmF6d2lza29baV0gPC0gc3RyX2RldGVjdChCTl93c3BvbHR3b3JjYSRYMjQ1Y1tpXSxCTl93c3BvbHR3b3JjYSRPU19OQVpXSVNLT1tpXSkNCiAgQk5fd3Nwb2x0d29yY2EkY3p5X2ltaWVbaV0gPC0gZ3JlcGwoQk5fd3Nwb2x0d29yY2EkT1NfSU1JRVtpXSxCTl93c3BvbHR3b3JjYSRYMjQ1Y1tpXSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2EgJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBpZmVsc2UoY3p5X25hendpc2tvPT1GQUxTRXxjenlfaW1pZT09RkFMU0UscGFzdGUoIlVXQUdBISBLb25mbGlrdCB3IGRhbnljaCBvc29ib3d5Y2ggdyBwb2xhY2ggNzAwIGkgMjQ1LiBQb3LDs3duYWogcG9sYSB3c3DDs8WCdMOzcmPDs3cgdyBmb3JtdWxhcnp1IHogcG9sZW0gQk46ICIsWDI0NWMsc2VwID0gIiIpLE5BKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phLFpBX0FETk9UQUNKRSkNCg0KIzc6IG9waXMgd3Nww7PFgnR3w7NyY8Ozdw0Kb3Bpc193c3BvbHR3b3Jjb3cgPC0gQk5fd3Nwb2x0d29yY2EgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxmdW5rY2phLE9TX0lNSUUsT1NfTkFaV0lTS08pICU+JQ0KICBmdWxsX2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShPU19OQVpXSVNLTyl8KGlzLm5hKE9TX05BWldJU0tPKSZncmVwbCgiZXQgYWxcXC4iLFgyNDVjKSkpICU+JQ0KICBtdXRhdGUoamVzdF9ldF9hbCA9IGdyZXBsKCJldCBhbFxcLiIsWDI0NWMpLA0KICAgICAgICAgT1NfSU1JRSA9IGlmZWxzZShPU19JTUlFPT0iKiIsIiIsYXMuY2hhcmFjdGVyKE9TX0lNSUUpKSwNCiAgICAgICAgIG9waXMgPSBpZmVsc2UoIWlzLm5hKE9TX05BWldJU0tPKSxwYXN0ZShmdW5rY2phLE9TX0lNSUUsIE9TX05BWldJU0tPLCBzZXAgPSAiICIpLCIiKSwNCiAgICAgICAgIG9waXMgPSBzdHJfcmVwbGFjZV9hbGwob3BpcywiICsiLCIgIiksDQogICAgICAgICBvcGlzID0gaWZlbHNlKG9waXM9PSIgIiwiIixhcy5jaGFyYWN0ZXIob3BpcykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXMsamVzdF9ldF9hbCkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKG9waXMgPSBwYXN0ZShvcGlzLGNvbGxhcHNlID0gIiwgIiksDQogICAgICAgICBqZXN0X2V0X2FsID0gcGFzdGUodW5pcXVlKGplc3RfZXRfYWwpLHNlcCA9ICIiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShvcGlzID0gaWZlbHNlKGplc3RfZXRfYWw9PVRSVUUmb3Bpcz09IiIsImV0IGFsLiIsDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShqZXN0X2V0X2FsLHBhc3RlKG9waXMsImV0IGFsLiIsc2VwID0gIiAiKSxvcGlzKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksb3BpcykNCg0KIzcwMA0KbWFyY19maWVsZF83MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg3MDApJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZXBsYWNlX2FsbChYNzAwLCIoLi5cXCRhKSIsInxcXDEiKSwNCiAgICAgICAgIFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDcwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZW1vdmVfYWxsKFg3MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg3MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF83MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNzAwPC1jYmluZChtYXJjX2ZpZWxkXzcwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzcwMCRYNzAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNzAwJFg3MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNzAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNzAwJFg3MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzcwMCRYNzAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzcwMCA8LSBtYXJjX2ZpZWxkXzcwMCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9zb2JhID0gYCRhYCxmdW5rY2phID0gYCRlYCkgJT4lDQogIGZpbHRlcighaXMubmEoZnVua2NqYSkpICU+JQ0KICBtdXRhdGUob3NvYmEgPSBzdHJfcmVtb3ZlKG9zb2JhLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpLA0KICAgICAgICAgT1NfTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIob3NvYmEpKSwNCiAgICAgICAgIE9TX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDMiKSwiKiIpLA0KICAgICAgICAgZnVua2NqYV9kdXphID0gc3RyX3RvX2xvd2VyKGZ1bmtjamEpLA0KICAgICAgICAgb3BpcyA9IHBhc3RlKGZ1bmtjamFfZHV6YSxPU19JTUlFLE9TX05BWldJU0tPLCBzZXAgPSAiICIpLA0KICAgICAgICAgb3Bpc19kdXp5ID0gcGFzdGUoZnVua2NqYSxPU19JTUlFLE9TX05BWldJU0tPLCBzZXAgPSAiICIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXMsb3Bpc19kdXp5KSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUob3BpcyA9IHBhc3RlKG9waXMsY29sbGFwc2UgPSAiLiAiKSwNCiAgICAgICAgIG9waXNfZHV6eSA9IHBhc3RlKG9waXNfZHV6eSxjb2xsYXBzZSA9ICIuICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKQ0KDQojb3BpcyB3c3DDs8WCdHfDs3Jjw7N3IHplIHN0cmVmeSBvZHBvd2llZHppYWxub8WbY2kgMjQ1DQptYXJjX2ZpZWxkXzI0NSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSklPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwifiIpLA0KICAgICAgICAgWDI0NT1zdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDU8LWNiaW5kKG1hcmNfZmllbGRfMjQ1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ1JFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDUkWDI0NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDUkWDI0NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ1JFgyNDUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMjQ1IDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRjYCkNCg0KI3BvcsOzd25hbmllIG9waXN1IHdzcMOzxYJ0d8OzcmPDs3cgeiAyNDUgaSA3MDANCndzcG9sdHdvcmN5IDwtIG1hcmNfZmllbGRfNzAwICU+JQ0KICBmdWxsX2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgY1NwbGl0KC4sIiRjIixzZXAgPSAiIDsgIixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICAjb2dyYW5pY3phbmllIG9zw7NiIHplIHN0cmVmeSBvZHBvd2llZHppYWxub8WbY2kNCiAgbXV0YXRlKGN6eV9tYWxhID0gZ3JlcGwoIiBbYS16xJnDs8SFxZvFgsW8xbrEh8WEXXxeW2EtesSZw7PEhcWbxYLFvMW6xIfFhF18XFxbW2EtesSZw7PEhcWbxYLFvMW6xIfFhF0iLGAkY2AsaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQ0KICBmaWx0ZXIoY3p5X21hbGE9PVRSVUUpICU+JQ0KICBzZWxlY3QoLWN6eV9tYWxhKSAlPiUNCiAgI211dGF0ZShgJGNgID0gZ3N1YigiXihcXFspezAsMX0oW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSIsIlxcMVxcVVxcMiIscGVybCA9IFRSVUUsYCRjYCkpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShYMjQ1ID0gcGFzdGUoYCRjYCwgY29sbGFwc2UgPSAiLCAiKSkgJT4lDQogIHNlbGVjdCgtYCRjYCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUob3JkZXJfcGJsID0gYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChvcGlzLCIoPzw9XnwgfFxcW3wtKShbQS1aQcOBw4DDgsODw4TEgsSAw4XEhMOGRcOJw4jDisOLxJrEksSWxJhJw43DjMOOw4/EqsSuSU/Dk8OSw5TDlcOWxZDDmMWSVcOaw5nDm8OcxbDFqsWvWcOdQ8SGxIzDp0TEjsSQxJBHxKLEnkvEtkzFgcS7TsWDw5HFh8WFxYpSxZhTxZrFoMWeU8OfVMWkxabDnsWiOFrFu8W5xb1hLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkiKSksDQogICAgICAgICBvcmRlcl9wYmwgPSBzdHJfcmVwbGFjZV9hbGwob3JkZXJfcGJsLCIoLio/XCIpKC4pKFwiLio/LikiLCAiXFwyIiksDQogICAgICAgICBvcmRlcl9ibiA9IGFzLmNoYXJhY3RlcihzdHJfZXh0cmFjdF9hbGwoWDI0NSwiKD88PV58IHxcXFt8LSkoW0EtWkHDgcOAw4LDg8OExILEgMOFxITDhkXDicOIw4rDi8SaxJLElsSYScONw4zDjsOPxKrErklPw5PDksOUw5XDlsWQw5jFklXDmsOZw5vDnMWwxarFr1nDnUPEhsSMw6dExI7EkMSQR8SixJ5LxLZMxYHEu07Fg8ORxYfFhcWKUsWYU8WaxaDFnlPDn1TFpMWmw57FojhaxbvFucW9YS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pIikpLA0KICAgICAgICAgb3JkZXJfYm4gPSBzdHJfcmVwbGFjZV9hbGwob3JkZXJfYm4sIiguKj9cIikoLikoXCIuKj8uKSIsICJcXDIiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsICJcXC4kIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCAiXFxbIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCAiXFxdIiksDQogICAgICAgICBvcmRlcl9wYmwgPSBzdHJfcmVtb3ZlX2FsbChvcmRlcl9wYmwsICJbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iKSwNCiAgICAgICAgIG9yZGVyX2JuID0gc3RyX3JlbW92ZV9hbGwob3JkZXJfYm4sICJbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iKSwNCiAgICAgICAgIHRvX3NhbW8gPSBvcmRlcl9wYmw9PW9yZGVyX2JuLA0KICAgICAgICAgWDI0NSA9IGdzdWIoIiheW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSguKikiLCJcXFVcXDFcXEVcXDIiLHBlcmwgPSBUUlVFLCBYMjQ1KSkgJT4lDQogIGxlZnRfam9pbiguLHphX2plenlrX29yeWdpbmFsdSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKGN6eV9wbCA9IGdyZXBsKCJwb2wiLFpBX0pFWllLX09SWUdJTkFMVSl8aXMubmEoWkFfSkVaWUtfT1JZR0lOQUxVKSwNCiAgICAgICAgIGRlY3l6amEgPSBpZmVsc2UodG9fc2Ftbz09RkFMU0V8Y3p5X3BsPT1GQUxTRSxGQUxTRSxUUlVFKSkNCg0KemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gd3Nwb2x0d29yY3kgJT4lDQogIG11dGF0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IGlmZWxzZShkZWN5emphPT1UUlVFLGFzLmNoYXJhY3RlcihYMjQ1KSxwYXN0ZShYMjQ1LG9waXNfZHV6eSxzZXAgPSAiIyIpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvcGlzX2R1enksemFfb3Bpc193c3BvbHR3b3Jjb3cpICU+JQ0KICBjU3BsaXQoLiwiemFfb3Bpc193c3BvbHR3b3Jjb3ciLHNlcCA9ICIjIixkaXJlY3Rpb24gPSAid2lkZSIpICU+JQ0KICBtdXRhdGUoemFfb3Bpc193c3BvbHR3b3Jjb3dfMiA9IGlmZWxzZShpcy5uYSh6YV9vcGlzX3dzcG9sdHdvcmNvd18yKSwnJyxhcy5jaGFyYWN0ZXIoemFfb3Bpc193c3BvbHR3b3Jjb3dfMikpLA0KICAgICAgICAgdG9fc2FtbyA9IHphX29waXNfd3Nwb2x0d29yY293XzE9PXphX29waXNfd3Nwb2x0d29yY293XzIpICU+JQ0KICBmaWx0ZXIodG9fc2Ftbz09RkFMU0UpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IHBhc3RlKHphX29waXNfd3Nwb2x0d29yY293XzEsemFfb3Bpc193c3BvbHR3b3Jjb3dfMixzZXAgPSAiIyIpLA0KICAgICAgICAgemFfb3Bpc193c3BvbHR3b3Jjb3cgPSBzdHJfcmVtb3ZlX2FsbCh6YV9vcGlzX3dzcG9sdHdvcmNvdywiXFwjJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHphX29waXNfd3Nwb2x0d29yY293KQ0KDQpvcGlzX3dzcG9sdHdvcmNvdyA8LSBvcGlzX3dzcG9sdHdvcmNvdyAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgemFfb3Bpc193c3BvbHR3b3Jjb3ckWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKG9waXMpKSAlPiUNCiAgcmVuYW1lKHphX29waXNfd3Nwb2x0d29yY293ID0gb3BpcykNCg0KemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gemFfb3Bpc193c3BvbHR3b3Jjb3cgJT4lDQogIGJpbmRfcm93cyguLG9waXNfd3Nwb2x0d29yY293KSAlPiUNCiAgcmlnaHRfam9pbiguLGRhdGEgJT4lIHNlbGVjdChaQV9VV0FHSSksYnk9IlpBX1VXQUdJIikNCg0KIzggd3lkYW5pZQ0KbWFyY19maWVsZF8yNTAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNTApJT4lDQogIGZpbHRlcihYMjUwIT0iIikgJT4lDQogIG11dGF0ZShYMjUwPXN0cl9yZXBsYWNlX2FsbChYMjUwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNTAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDI1MD1zdHJfcmVtb3ZlX2FsbChYMjUwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNTAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjUwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjUwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI1MDwtY2JpbmQobWFyY19maWVsZF8yNTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNTAkWDI1MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI1MCRYMjUwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI1MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI1MCRYMjUwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNTAkWDI1MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQp6YV93eWRhbmllIDwtIG1hcmNfZmllbGRfMjUwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIHd5ZGFuaWUgPSBgJGFgKSAlPiUNCiAgbXV0YXRlKHd5ZGFuaWUgPSBzdHJfcmVtb3ZlKHd5ZGFuaWUsIiBcXC8kIikpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojOTogaW5zdHl0dWNqYSBzcHJhd2N6YQ0KbWFyY19maWVsZF8yNDUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIn4iKSwNCiAgICAgICAgIFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ1PC1jYmluZChtYXJjX2ZpZWxkXzI0NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NSRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ1JFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ1JFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NSRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCnphX2luc3R5dHVjamEgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1Yz1gJGNgKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShYMjQ1YykpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IGlmZWxzZShncmVwbCgiXFw7IixYMjQ1Yyksc3RyX3JlcGxhY2VfYWxsKFgyNDVjLCAiKC4qPykoXFw7KD8hLipcXDspKSggKSsoLio/JCkiLCJcXDQiKSwiIikpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSxieT0iWkFfVVdBR0kiKQ0KDQp4IDwtIDE6bGVuZ3Rocyh6YV9pbnN0eXR1Y2phWzFdKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgemFfaW5zdHl0dWNqYSRjenlfbmF6d2lza29baV0gPC0gZ3JlcGwoemFfaW5zdHl0dWNqYSRPU19OQVpXSVNLT1tpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KICB6YV9pbnN0eXR1Y2phJGN6eV9pbWllW2ldIDwtIGdyZXBsKHphX2luc3R5dHVjamEkT1NfSU1JRVtpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KfQ0KDQp6YV9pbnN0eXR1Y2phIDwtIHphX2luc3R5dHVjamEgJT4lDQogIGZpbHRlcihpcy5uYShjenlfbmF6d2lza28pJmlzLm5hKGN6eV9pbWllKSkgJT4lDQogIGZpbHRlcihpbnN0eXR1Y2phIT0iIikgJT4lDQogIGZpbHRlcighZ3JlcGwoIl5cXFtbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl18XlthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSIsaW5zdHl0dWNqYSkpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IHN0cl9yZW1vdmUoaW5zdHl0dWNqYSwiXFwuJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGluc3R5dHVjamEpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMTA6IHd5ZGF3bmljdHdvDQpCTl93eWRhd25pY3R3byA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIFgyNjApICU+JQ0KICBtdXRhdGUoWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwublxcLiIsICJiLncuIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJTXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZW1vdmUoWDI2MCwiXlxcXFwrIiksIA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfZXh0cmFjdF9hbGwoWDI2MCwgIig/PD1cXCRjKS4qKD89XFwkZSl8KD88PVxcJGMpLioiKSwgDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCAiLlxcJGMuKiIsICIiKSwgDQogICAgICAgICBpbGVfd3lkYXduaWN0dyA9IHN0cl9jb3VudChiZXpfcm9rdSwgIlxcJGIiKSwNCiAgICAgICAgIGlsZV9taWVqc2MgPSBzdHJfY291bnQoYmV6X3Jva3UsICJcXCRhIiksDQogICAgICAgICBrb2xlam5vc2MgPSBzdHJfcmVwbGFjZV9hbGwoYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChiZXpfcm9rdSwgIlxcJC4iKSksICJbXmEtel0iLCAiIiksDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChiZXpfcm9rdSwgIjtcXCRiIiwgIjokYiIpLA0KICAgICAgICAgd3lkYXdfcG9kemllbCA9IGlmZWxzZShpbGVfd3lkYXduaWN0dz5pbGVfbWllanNjfGtvbGVqbm9zYz09ImNhYWJiIiwgc3RyX3JlcGxhY2VfYWxsKGJlel9yb2t1LCAiKFxcJGEpKC4qPykoIDpcXCRiLio/KSggOlxcJGIpIiwgIlxcMVxcMlxcMyA7JGFcXDJcXDQiKSxiZXpfcm9rdSksDQogICAgICAgICB3eWRhd25pY3R3b190ZXN0ID0gc3RyX3JlcGxhY2VfYWxsKHd5ZGF3X3BvZHppZWwsICIoXFwkYikoLio/KSggO1xcJGEpIiwgIlxcMVxcMnxcXDMiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxyb2tfd3lkYW5pYSx3eWRhd25pY3R3b190ZXN0KSAlPiUNCiAgY1NwbGl0KC4sICJ3eWRhd25pY3R3b190ZXN0Iiwgc2VwID0gInwiLCBkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBtdXRhdGUod3lkYXduaWN0d28gPSBzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRiKSguKikiKSwNCiAgICAgICAgIG1pZWpzY2Vfd3lkYW5pYSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRhKSguKikoPz0gezAsMX06IHswLDF9XFwkYil8KD88PVxcJGEpKC4qKSgkKSIpLCIgO1xcJGEiLCAiLCAiKSwNCiAgICAgICAgIG5hendhX3Byb3N0YSA9IHN0cl90b19sb3dlcihzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKHVubGlzdCh3eWRhd25pY3R3b190ZXN0KSwgIlxcJFxcdyIsICIiKSwgIlxcVyIsICIiKSkpICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfd3lkYXduaWN0d2EsYnk9Im5hendhX3Byb3N0YSIpICU+JQ0KICBtdXRhdGUodG9fc2FtbyA9IHd5ZGF3bmljdHdvPT1XWV9OQVpXQSkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLXRvX3NhbW8sLVdZX0xJQ1pCQV9aQVBJU09XKQ0KQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX3d5ZGF3bmljdHdvWzE6M10pKQ0KQk5fd3lkYXduaWN0d28gPC0gQk5fd3lkYXduaWN0d29bIWR1cGxpY2F0ZWQoQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkpLF0gJT4lDQogIG11dGF0ZShXWV9OQVpXQSA9IGlmZWxzZSghaXMubmEoV1lfTkFaV0EpLGFzLmNoYXJhY3RlcihXWV9OQVpXQSksYXMuY2hhcmFjdGVyKHd5ZGF3bmljdHdvKSksDQogICAgICAgICBXWV9NSUFTVE8gPSBpZmVsc2UoIWlzLm5hKFdZX01JQVNUTyksYXMuY2hhcmFjdGVyKFdZX01JQVNUTyksYXMuY2hhcmFjdGVyKG1pZWpzY2Vfd3lkYW5pYSkpLA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfcmVwbGFjZV9hbGwocm9rX3d5ZGFuaWEsICIoLiopKFxcLikiLCAiXFwxIiksDQogICAgICAgICB6YV9yb2tfd3lkYW5pYSA9IGlmZWxzZShuY2hhcihyb2tfd3lkYW5pYSk9PTQsYXMuY2hhcmFjdGVyKHJva193eWRhbmlhKSxOQSksDQogICAgICAgICBkb19vcGlzdSA9IGlmZWxzZShpcy5uYSh6YV9yb2tfd3lkYW5pYSkscGFzdGUoIlsiLHN0cl9leHRyYWN0KHJva193eWRhbmlhLCJcXGR7NH0iKSwiXSIsc2VwID0gIiIpLCIiKSwNCiAgICAgICAgIFdZX01JQVNUTyA9IGlmZWxzZShzdWJzdHIoV1lfTUlBU1RPLDEsMSk9PSJbIiZzdWJzdHIoV1lfTUlBU1RPLG5jaGFyKFdZX01JQVNUTyksbmNoYXIoV1lfTUlBU1RPKSkhPSJdIiZpcy5uYShXWV9XWURBV05JQ1RXT19JRCkscGFzdGUodHJpbShXWV9NSUFTVE8pLCJdIixzZXAgPSAiIiksYXMuY2hhcmFjdGVyKFdZX01JQVNUTykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFdZX1dZREFXTklDVFdPX0lELFdZX05BWldBLFdZX01JQVNUTyx6YV9yb2tfd3lkYW5pYSxkb19vcGlzdSkNCg0KIzExOiBvcGlzIGZpenljem55IGtzacSFxbxraQ0KI3BvbGUgMzAwIGRvIG9waXN1IGZpenljem5lZ28NCm1hcmNfZmllbGRfMzAwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMzAwKSU+JQ0KICBmaWx0ZXIoWDMwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDMwMD1zdHJfcmVwbGFjZV9hbGwoWDMwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMzAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgzMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgzMDA9c3RyX3JlbW92ZV9hbGwoWDMwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMzAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDMwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzMwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8zMDA8LWNiaW5kKG1hcmNfZmllbGRfMzAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMzAwJFgzMDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8zMDAkWDMwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8zMDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8zMDAkWDMwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMzAwJFgzMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMzAwIDwtIG1hcmNfZmllbGRfMzAwICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpLA0KICAgICAgICAgYCRiYCA9IHN0cl9yZW1vdmUoYCRiYCwiIFxcOyskfCBcXDorJCIpLA0KICAgICAgICAgYCRlYCA9IGlmZWxzZShncmVwbCgiQ0QtUk9NfERWRHxWQ0R8Q0QiLGAkZWApJmdyZXBsKCJcXCsgZHlza3xwxYJ5dCIsYCRlYCksc3RyX2V4dHJhY3QoYCRlYCwiKD88PVxcKykoZHlza3xwxYJ5dC4qPykoQ0QtUk9NfERWRHxWQ0R8Q0QpKFxcKSl7MCwxfSIpLA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIkNELVJPTXxEVkR8VkNEfENEIixgJGVgKSxzdHJfZXh0cmFjdChgJGVgLCIoXi4qPykoQ0QtUk9NfERWRHxWQ0R8Q0QpKFxcKSl7MCwxfSIpLE5BKSksDQogICAgICAgICBgJGFgID0gaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksDQogICAgICAgICBgJGJgID0gaWZlbHNlKGlzLm5hKGAkYmApLCIiLGFzLmNoYXJhY3RlcihgJGJgKSksDQogICAgICAgICBgJGVgID0gaWZlbHNlKGlzLm5hKGAkZWApLCIiLGFzLmNoYXJhY3RlcihgJGVgKSkpDQojcG9sZSA1MDAgZG8gb3Bpc3UgZml6eWN6bmVnbw0KbWFyY19maWVsZF81MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg1MDApJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZXBsYWNlX2FsbChYNTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg1MDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDUwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMD1zdHJfcmVtb3ZlX2FsbChYNTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg1MDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzUwMDwtY2JpbmQobWFyY19maWVsZF81MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF81MDAkWDUwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzUwMCRYNTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzUwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzUwMCRYNTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF81MDAkWDUwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF81MDAgPC0gbWFyY19maWVsZF81MDAgJT4lDQogIG11dGF0ZShgJGFgID0gaWZlbHNlKGdyZXBsKCJvcnlnKFxcLnxcXCwpIixYNTAwKSZncmVwbCgicHNldWR8bmF6d2EiLFg1MDAsaWdub3JlLmNhc2UgPSBUUlVFKSxzdHJfcmVwbGFjZShgJGFgLCIoXi4qPykoXFwuICkoXFxwe0x1fS4qJCkiLCJcXDMiKSxhcy5jaGFyYWN0ZXIoYCRhYCkpKSAlPiUgDQogIGZpbHRlcighZ3JlcGwoIm9yeWcoXFwufFxcLCkiLGAkYWApJmdyZXBsKCJwc2V1ZHxuYXp3YXxkb3R5Y3p8cG9sIixgJGFgLGlnbm9yZS5jYXNlID0gVFJVRSkpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpKQ0KICANCiNwb2xlIDU0NiBkbyBvcGlzdSBmaXp5Y3puZWdvDQptYXJjX2ZpZWxkXzU0NiA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDU0NiklPiUNCiAgZmlsdGVyKFg1NDYhPSIiKSAlPiUNCiAgbXV0YXRlKFg1NDY9c3RyX3JlcGxhY2VfYWxsKFg1NDYsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDU0NiIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTQ2IT0iIikgJT4lDQogIG11dGF0ZShYNTQ2PXN0cl9yZW1vdmVfYWxsKFg1NDYsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDU0NiwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1NDYsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81NDYpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTQ2PC1jYmluZChtYXJjX2ZpZWxkXzU0NixlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzU0NiRYNTQ2IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTQ2JFg1NDYsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTQ2WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTQ2JFg1NDYpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzU0NiRYNTQ2KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzU0NiA8LSBtYXJjX2ZpZWxkXzU0NiAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSkNCg0KemFfb3Bpc19rcyA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93eWRhd25pY3R3byAlPiUgc2VsZWN0KFpBX1VXQUdJLGRvX29waXN1KSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8zMDAgJT4lIHNlbGVjdChaQV9VV0FHSSxYMzAwYT1gJGFgLFgzMDBiPWAkYmAsWDMwMGU9YCRlYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTAwICU+JSBzZWxlY3QoWkFfVVdBR0ksWDUwMGE9YCRhYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTQ2ICU+JSBzZWxlY3QoWkFfVVdBR0ksWDU0NmE9YCRhYCksYnk9IlpBX1VXQUdJIikNCnphX29waXNfa3NbaXMubmEoemFfb3Bpc19rcyldICA8LSAiIg0KemFfb3Bpc19rcyA8LSB6YV9vcGlzX2tzICU+JQ0KICBtdXRhdGUoemFfb3Bpc19rcyA9IHBhc3RlKGlmZWxzZShkb19vcGlzdSE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKGRvX29waXN1KSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFgzMDBhIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDMwMGEpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDMwMGIhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYMzAwYiksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYMzAwZSE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKFgzMDBlKSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFg1MDBhIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDUwMGEpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDU0NmEhPSIiLGFzLmNoYXJhY3RlcihYNTQ2YSksIiIpLHNlcCA9ICIiKSwNCiAgICAgICAgIHphX29waXNfa3MgPSBzdHJfcmVtb3ZlKHphX29waXNfa3MsIigsICkrJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHphX29waXNfa3MpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSwtbmNoYXIoemFfb3Bpc19rcykpDQp6YV9vcGlzX2tzJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZCh6YV9vcGlzX2tzWzFdKSkNCnphX29waXNfa3MgPC0gemFfb3Bpc19rc1shZHVwbGljYXRlZCh6YV9vcGlzX2tzJGlkX2dydXB5KSxdICU+JQ0KICBzZWxlY3QoLWlkX2dydXB5KQ0KDQojMTI6IHNlcmlhIHd5ZGF3bmljemENCm1hcmNfZmllbGRfNDkwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNDkwLFg4MDAsWDgzMCkgJT4lDQogIG11dGF0ZShYNDkwID0gaWZlbHNlKGdyZXBsKCJVXFwrIixYNDkwKSxhcy5jaGFyYWN0ZXIoWDgzMCksYXMuY2hhcmFjdGVyKFg0OTApKSkgJT4lDQogIG11dGF0ZShYODAwID0gaWZlbHNlKFg0OTAhPSIiLCIiLGFzLmNoYXJhY3RlcihYODAwKSksDQogICAgICAgICBYODMwID0gaWZlbHNlKFg0OTAhPSIiLCIiLGFzLmNoYXJhY3RlcihYODMwKSksDQogICAgICAgICBYODAwID0gc3RyX3JlcGxhY2UoWDgwMCwiKFxcJGEpKC4qKShcXCR0KSIsIlxcMSIpLA0KICAgICAgICAgWDQ5MCA9IGlmZWxzZShYNDkwPT0iIiZYODMwIT0iIixhcy5jaGFyYWN0ZXIoWDgzMCksDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShYNDkwPT0iIiZYODAwIT0iIixhcy5jaGFyYWN0ZXIoWDgwMCksYXMuY2hhcmFjdGVyKFg0OTApKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDQ5MCkgJT4lDQogIGZpbHRlcihYNDkwIT0iIikgJT4lDQogIG11dGF0ZShYNDkwPXN0cl9yZXBsYWNlX2FsbChYNDkwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg0OTAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDQ5MCE9IiIpICU+JQ0KICBtdXRhdGUoWDQ5MD1zdHJfcmVtb3ZlX2FsbChYNDkwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg0OTAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNDkwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNDkwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzQ5MDwtY2JpbmQobWFyY19maWVsZF80OTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF80OTAkWDQ5MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzQ5MCRYNDkwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzQ5MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzQ5MCRYNDkwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF80OTAkWDQ5MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KemFfc2VyaWFfd3lkYXduaWN6YSA8LSBtYXJjX2ZpZWxkXzQ5MCAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKD0pKFxcJGEpIiwiXFwxICIpLA0KICAgICAgICAgYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpLA0KICAgICAgICAgYCR2YCA9IGlmZWxzZShpcy5uYShgJHZgKSwiIixhcy5jaGFyYWN0ZXIoYCR2YCkpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShgJGFgKSkgJT4lDQogIG11dGF0ZShzZXJpYSA9IHN0cl9yZW1vdmUocGFzdGUoIigiLGAkYWAsIjsgIixgJHZgLCIpIixzZXAgPSAiIiksIjsgKD89XFwpJCkiKSwNCiAgICAgICAgIHNlcmlhID0gZ3N1YigiKCA6ICkoLikiLCIuIFxcVVxcMiIscGVybD1UUlVFLHNlcmlhKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxzZXJpYSkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKHNlcmlhID0gcGFzdGUoc2VyaWEsY29sbGFwc2UgPSAiICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKHNlcmlhID0gc3RyX3JlcGxhY2VfYWxsKHNlcmlhLCJcXCQuIiwiOyAiKSkgJT4lDQogIHJpZ2h0X2pvaW4oLixkYXRhICU+JSBzZWxlY3QoWkFfVVdBR0kpLGJ5PSJaQV9VV0FHSSIpDQoNCiMxMzogdG9teQ0KemFfdG9teSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoemFfdG9teSA9IE5BKQ0KDQojMTQ6IGFkbm90YWNqZQ0KemFfYWRub3RhY2plIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLFpBX0FETk9UQUNKRSAlPiUgc2VsZWN0KFpBX1VXQUdJLFpBX0FETk9UQUNKRSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX3dzcG9sdHdvcmNhICU+JSBzZWxlY3QoWkFfVVdBR0ksWkFfQUROT1RBQ0pFKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKFpBX0FETk9UQUNKRSA9IHBhc3RlKGlmZWxzZShpcy5uYShaQV9BRE5PVEFDSkUueCksIiIscGFzdGUoYXMuY2hhcmFjdGVyKFpBX0FETk9UQUNKRS54KSwiIyAiLHNlcCA9ICIiKSksaWZlbHNlKGlzLm5hKFpBX0FETk9UQUNKRS55KSwiIixhcy5jaGFyYWN0ZXIoWkFfQUROT1RBQ0pFLnkpKSxzZXAgPSAiIiksDQogICAgICAgICBaQV9BRE5PVEFDSkUgPSBzdHJfcmVtb3ZlKFpBX0FETk9UQUNKRSwiKCMgKSskIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWkFfQUROT1RBQ0pFKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLW5jaGFyKFpBX0FETk9UQUNKRSkpDQp6YV9hZG5vdGFjamUkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKHphX2Fkbm90YWNqZVsxXSkpDQp6YV9hZG5vdGFjamUgPC0gemFfYWRub3RhY2plWyFkdXBsaWNhdGVkKHphX2Fkbm90YWNqZSRpZF9ncnVweSksXSAlPiUNCiAgc2VsZWN0KC1pZF9ncnVweSkNCg0KIzE1OiBCTl9VUkwNCkJOX1VSTCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQk5fVVJMKQ0KDQojd3lyw7N3bmFuaWUgbGljemJ5IHdpZXJzenkgZG8gbGljemJ5IHdpZXJzenkgb2JpZWt0dSBkYXRhDQpCTl93c3BvbHR3b3JjYSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSAlPiUgc2VsZWN0KFpBX1VXQUdJLE9TX09TT0JBX0lELE9TX05BWldJU0tPLE9TX0lNSUUsZm9fc3ltYm9sKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgZGRwbHkoLiwgLihaQV9VV0FHSSksIHN1bW1hcml6ZSwgT1NfT1NPQkFfSUQgPSBwYXN0ZShPU19PU09CQV9JRCwgY29sbGFwc2U9InwiKSwgT1NfTkFaV0lTS08gPSBwYXN0ZShPU19OQVpXSVNLTywgY29sbGFwc2U9InwiKSwgT1NfSU1JRSA9IHBhc3RlKE9TX0lNSUUsIGNvbGxhcHNlPSJ8IiksIGZvX3N5bWJvbCA9IHBhc3RlKGZvX3N5bWJvbCwgY29sbGFwc2U9InwiKSkgJT4lDQogIG11dGF0ZShmb19zeW1ib2wgPSBpZmVsc2UoZm9fc3ltYm9sPT0iTlVMTCIsIk5BIixhcy5jaGFyYWN0ZXIoZm9fc3ltYm9sKSkpDQpCTl93eWRhd25pY3R3byA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93eWRhd25pY3R3byAlPiUgc2VsZWN0KFpBX1VXQUdJLFdZX1dZREFXTklDVFdPX0lELFdZX05BWldBLFdZX01JQVNUTyx6YV9yb2tfd3lkYW5pYSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGRkcGx5KC4sIC4oWkFfVVdBR0kpLCBzdW1tYXJpemUsIFdZX1dZREFXTklDVFdPX0lEID0gcGFzdGUoV1lfV1lEQVdOSUNUV09fSUQsIGNvbGxhcHNlPSJ8IiksIFdZX05BWldBID0gcGFzdGUoV1lfTkFaV0EsIGNvbGxhcHNlPSJ8IiksIFdZX01JQVNUTyA9IHBhc3RlKFdZX01JQVNUTywgY29sbGFwc2U9InwiKSwgemFfcm9rX3d5ZGFuaWEgPSBwYXN0ZSh1bmlxdWUoemFfcm9rX3d5ZGFuaWEpLCBjb2xsYXBzZT0ifCIpKSAlPiUNCiAgbXV0YXRlKHphX3Jva193eWRhbmlhID0gaWZlbHNlKHphX3Jva193eWRhbmlhPT0iTkEiLCIiLGFzLmludGVnZXIoemFfcm9rX3d5ZGFuaWEpKSkNCg0KI3BvxYLEhWN6ZW5pZSB3c3p5c3RraWNoIGVsZW1lbnTDs3cgdyBqZWRuxIUgdGFiZWzEmQ0Ka29sZWpub3NjIDwtIGRhdGEuZnJhbWUoa29sZWpub3NjPWMoIlpBX1VXQUdJIiwiUlpfTkFaV0EiLCJaQV9ST19ST0siLCJaQV9UWVBFIiwiUlpfUk9EWkFKX0lEIiwiRFpfTkFaV0EiLCJEWl9EWklBTF9JRCIsIlRXX1RXT1JDQV9JRCIsIkFNX0FVVE9SX0lEIiwiQU1fTkFaV0lTS08iLCJBTV9JTUlFIiwiWkFfVFlUVUwiLCJaQV9UWVRVTF9PUllHSU5BTFUiLCJaQV9KRVpZS19PUllHSU5BTFUiLCJPU19PU09CQV9JRCIsIk9TX05BWldJU0tPIiwiT1NfSU1JRSIsImZvX3N5bWJvbCIsInphX29waXNfd3Nwb2x0d29yY293Iiwid3lkYW5pZSIsInphX3RvbXkiLCJpbnN0eXR1Y2phIiwiV1lfV1lEQVdOSUNUV09fSUQiLCJXWV9NSUFTVE8iLCJXWV9OQVpXQSIsInphX3Jva193eWRhbmlhIiwiemFfb3Bpc19rcyIsInNlcmlhIiwiVFdfTkFaV0lTS08iLCJUV19JTUlFIiwicmVkYWt0b3JfZHppYWx1IiwiWkFfQUROT1RBQ0pFIiwiQk5fVVJMIikpDQpwb2xhY3pvbmUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4scG9sYV9wYmwsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fYXV0b3IsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfdHl0dWwsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfdHl0dWxfb3J5Z2luYWx1LGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX2plenlrX29yeWdpbmFsdSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9vcGlzX3dzcG9sdHdvcmNvdyxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV93eWRhbmllLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX2luc3R5dHVjamEsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3lkYXduaWN0d28sYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfb3Bpc19rcyxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9zZXJpYV93eWRhd25pY3phLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3RvbXksYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfYWRub3RhY2plLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX1VSTCxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBzZWxlY3QoYXMudmVjdG9yKGtvbGVqbm9zYyRrb2xlam5vc2MpKQ0KY29sbmFtZXMocG9sYWN6b25lKSA8LSBjKCJyZWtvcmRfQk4iLCJyel9uYXp3YSIsInphX3JvX3JvayIsInphX3R5cGUiLCJyel9yb2R6YWpfaWQiLCJEWl9OQVpXQSIsIkRaX0RaSUFMX0lEIiwidHdfdHdvcmNhX2lkIiwiYW1fYXV0b3JfaWQiLCJhbV9uYXp3aXNrbyIsImFtX2ltaWUiLCJ6YV90eXR1bCIsInphX3R5dHVsX29yeWdpbmFsdSIsInphX2plenlrX29yeWdpbmFsdSIsIm9zX29zb2JhX2lkIiwib3NfbmF6d2lza28iLCJvc19pbWllIiwiZm9fc3ltYm9sIiwiemFfb3Bpc193c3BvbHR3b3Jjb3ciLCJ6YV93eWRhbmllIiwiemFfdG9teSIsInphX2luc3R5dHVjamEiLCJ3eV93eWRhd25pY3R3b19pZCIsInd5X21pZWpzY2UiLCJ3eV9uYXp3YSIsInphX3Jva193eWRhbmlhIiwiemFfb3Bpc19maXp5Y3pueV9rc2lhemtpIiwiemFfc2VyaWFfd3lkYXduaWN6YSIsInR3X25hendpc2tvIiwidHdfaW1pZSIsInByYWNvd25payIsInphX2Fkbm90YWNqZSIsIkJOX1VSTCIpDQoNCiN6YXN5Z25hbGl6b3dhbmllIG5pZXBvcHJhd25lZ28ga29kb3dhbmlhDQp4IDwtIDE6KGxlbmd0aChwb2xhY3pvbmUpLTIpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIHBvbGFjem9uZSR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGdyZXBsKCI8VVxcKyguLi4uKT4iLHBvbGFjem9uZVssaV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobmNoYXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkhPTAscGFzdGUocG9sYWN6b25lJHphX2Fkbm90YWNqZSxwYXN0ZSgiVVdBR0EhIELFgsSFZCBrb2Rvd2FuaWEgdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgWm5hamTFuiBmcmF6xJkgXCI/Pz9cIiBpIHpyZWRhZ3VqIHBvbGUiLHNlcCA9ICIiKSxzZXAgPSAiIyAiKSxwYXN0ZSgiVVdBR0EhIELFgsSFZCBrb2Rvd2FuaWEgdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgWm5hamTFuiBmcmF6xJkgXCI/Pz9cIiBpIHpyZWRhZ3VqIHBvbGUiLHNlcCA9ICIiKSksYXMuY2hhcmFjdGVyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpKQ0KICBwb2xhY3pvbmVbLGldIDwtIGdzdWIoIjxVXFwrKC4uLi4pPiIsICI/Pz8iLCBwb2xhY3pvbmVbLGldKQ0KfQ0KI3phc3lnbmFsaXpvd2FuaWUgb2JlY25vxZtjaSB6bmFrdSAkIHcga3TDs3J5bcWbIHogcMOzbA0KWCA8LSAxOihsZW5ndGgocG9sYWN6b25lKS0yKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiXFwkIixwb2xhY3pvbmVbLGldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5jaGFyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpPT0wLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gem5hayBcIiRcIi4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHBhc3RlKHBvbGFjem9uZSR6YV9hZG5vdGFjamUscGFzdGUoIlVXQUdBISBaZSB3emdsxJlkdSBuYSBixYLEmWRueSB6YXBpcyBCTiB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiB3eWRydWtvd2FubyB6bmFrIFwiJFwiLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksc2VwID0gIiMgIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCn0NCiN6YXN5Z25hbGl6b3dhbmllIG9iZWNub8WbY2kgZnJhenkgImNoYXJhY3RlcigwKSIgdyBrdMOzcnltxZsgeiBww7NsDQpYIDwtIDE6KGxlbmd0aChwb2xhY3pvbmUpLTIpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIHBvbGFjem9uZSR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGdyZXBsKCJjaGFyYWN0ZXJcXCgwXFwpIixwb2xhY3pvbmVbLGldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5jaGFyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpPT0wLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gZnJhesSZIFwiY2hhcmFjdGVyKDApXCIuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gZnJhesSZIFwiY2hhcmFjdGVyKDApXCIuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxzZXAgPSAiIyAiKSksYXMuY2hhcmFjdGVyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpKQ0KfQ0KI3phc3lnbmFsaXpvd2FuaWUgb2JlY25vxZtjaSB6bmFrdSAjIHcgb3Bpc2llIHdzcMOzxYJ0d8OzcmPDs3cNCnBvbGFjem9uZSR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGdyZXBsKCJcXCMiLHBvbGFjem9uZSR6YV9vcGlzX3dzcG9sdHdvcmNvdyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKT09MCwiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGtvbmZsaWt0IHcgb3Bpc2llIHdzcMOzxYJ0d8OzcmPDs3cgd3liaWVyeiB3xYJhxZtjaXfEhSB3YXJ0b8WbxIcgKHN0cmVmYSBvZHBvd2llZHppYWxub8WbY2kgXCIjXCIgd3Nww7PFgnR3w7NyY3kgeiBwb2xhIDcwMCkiLHBhc3RlKHBvbGFjem9uZSR6YV9hZG5vdGFjamUsIlVXQUdBISBaZSB3emdsxJlkdSBuYSBrb25mbGlrdCB3IG9waXNpZSB3c3DDs8WCdHfDs3Jjw7N3IHd5Ymllcnogd8WCYcWbY2l3xIUgd2FydG/Fm8SHIChzdHJlZmEgb2Rwb3dpZWR6aWFsbm/Fm2NpICMgd3Nww7PFgnR3w7NyY3kgeiBwb2xhIDcwMCkiLHNlcCA9ICIjICIpKSxhcy5jaGFyYWN0ZXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkpDQoNCm91dCA8LSBjU3BsaXQocG9sYWN6b25lLCBjKCJhbV9hdXRvcl9pZCIsICJhbV9uYXp3aXNrbyIsICJhbV9pbWllIiwib3Nfb3NvYmFfaWQiLCJvc19uYXp3aXNrbyIsICJvc19pbWllIiwgImZvX3N5bWJvbCIsInd5X3d5ZGF3bmljdHdvX2lkIiwid3lfbWllanNjZSIsInd5X25hendhIiksc2VwID0gInwiLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIHVuaXF1ZSgpDQoNCm91dCRyZWtvcmRfQk4gPC0gaWZlbHNlKGlzLm5hKG91dCRyZWtvcmRfQk4pLCcnLGFzLmNoYXJhY3RlcihvdXQkcmVrb3JkX0JOKSkNCm91dCRyel9uYXp3YSA8LSBpZmVsc2UoaXMubmEob3V0JHJ6X25hendhKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHJ6X25hendhKSkNCm91dCR6YV9yb19yb2sgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9yb19yb2spLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfcm9fcm9rKSkNCm91dCR6YV90eXBlIDwtIGlmZWxzZShpcy5uYShvdXQkemFfdHlwZSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90eXBlKSkNCm91dCRyel9yb2R6YWpfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCRyel9yb2R6YWpfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkcnpfcm9kemFqX2lkKSkNCm91dCREWl9OQVpXQSA8LSBpZmVsc2UoaXMubmEob3V0JERaX05BWldBKSwnJyxhcy5jaGFyYWN0ZXIob3V0JERaX05BWldBKSkNCm91dCREWl9EWklBTF9JRCA8LSBpZmVsc2UoaXMubmEob3V0JERaX0RaSUFMX0lEKSwnJyxhcy5jaGFyYWN0ZXIob3V0JERaX0RaSUFMX0lEKSkNCm91dCR0d190d29yY2FfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCR0d190d29yY2FfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkdHdfdHdvcmNhX2lkKSkNCm91dCRhbV9hdXRvcl9pZCA8LSBpZmVsc2UoaXMubmEob3V0JGFtX2F1dG9yX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGFtX2F1dG9yX2lkKSkNCm91dCRhbV9uYXp3aXNrbyA8LSBpZmVsc2UoaXMubmEob3V0JGFtX25hendpc2tvKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGFtX25hendpc2tvKSkNCm91dCRhbV9pbWllIDwtIGlmZWxzZShpcy5uYShvdXQkYW1faW1pZSksJycsYXMuY2hhcmFjdGVyKG91dCRhbV9pbWllKSkNCm91dCR6YV90eXR1bCA8LSBpZmVsc2UoaXMubmEob3V0JHphX3R5dHVsKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3R5dHVsKSkNCm91dCR6YV90eXR1bF9vcnlnaW5hbHUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90eXR1bF9vcnlnaW5hbHUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdHl0dWxfb3J5Z2luYWx1KSkNCm91dCR6YV9qZXp5a19vcnlnaW5hbHUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9qZXp5a19vcnlnaW5hbHUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfamV6eWtfb3J5Z2luYWx1KSkNCm91dCRvc19vc29iYV9pZCA8LSBpZmVsc2UoaXMubmEob3V0JG9zX29zb2JhX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JG9zX29zb2JhX2lkKSkNCm91dCRvc19uYXp3aXNrbyA8LSBpZmVsc2UoaXMubmEob3V0JG9zX25hendpc2tvKSwnJyxhcy5jaGFyYWN0ZXIob3V0JG9zX25hendpc2tvKSkNCm91dCRvc19pbWllIDwtIGlmZWxzZShpcy5uYShvdXQkb3NfaW1pZSksJycsYXMuY2hhcmFjdGVyKG91dCRvc19pbWllKSkNCm91dCRmb19zeW1ib2wgPC0gaWZlbHNlKGlzLm5hKG91dCRmb19zeW1ib2wpLCcnLGFzLmNoYXJhY3RlcihvdXQkZm9fc3ltYm9sKSkNCm91dCR6YV9vcGlzX3dzcG9sdHdvcmNvdyA8LSBpZmVsc2UoaXMubmEob3V0JHphX29waXNfd3Nwb2x0d29yY293KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX29waXNfd3Nwb2x0d29yY293KSkNCm91dCR6YV93eWRhbmllIDwtIGlmZWxzZShpcy5uYShvdXQkemFfd3lkYW5pZSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV93eWRhbmllKSkNCm91dCR6YV90b215IDwtIGlmZWxzZShpcy5uYShvdXQkemFfdG9teSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90b215KSkNCm91dCR6YV9pbnN0eXR1Y2phIDwtIGlmZWxzZShpcy5uYShvdXQkemFfaW5zdHl0dWNqYSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9pbnN0eXR1Y2phKSkNCm91dCR3eV93eWRhd25pY3R3b19pZCA8LSBpZmVsc2UoaXMubmEob3V0JHd5X3d5ZGF3bmljdHdvX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHd5X3d5ZGF3bmljdHdvX2lkKSkNCm91dCR3eV9taWVqc2NlIDwtIGlmZWxzZShpcy5uYShvdXQkd3lfbWllanNjZSksJycsYXMuY2hhcmFjdGVyKG91dCR3eV9taWVqc2NlKSkNCm91dCR3eV9uYXp3YSA8LSBpZmVsc2UoaXMubmEob3V0JHd5X25hendhKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHd5X25hendhKSkNCm91dCR6YV9yb2tfd3lkYW5pYSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3Jva193eWRhbmlhKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3Jva193eWRhbmlhKSkNCm91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2kgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2kpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfb3Bpc19maXp5Y3pueV9rc2lhemtpKSkNCm91dCR6YV9zZXJpYV93eWRhd25pY3phIDwtIGlmZWxzZShpcy5uYShvdXQkemFfc2VyaWFfd3lkYXduaWN6YSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9zZXJpYV93eWRhd25pY3phKSkNCm91dCR0d19uYXp3aXNrbyA8LSBpZmVsc2UoaXMubmEob3V0JHR3X25hendpc2tvKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHR3X25hendpc2tvKSkNCm91dCR0d19pbWllIDwtIGlmZWxzZShpcy5uYShvdXQkdHdfaW1pZSksJycsYXMuY2hhcmFjdGVyKG91dCR0d19pbWllKSkNCm91dCRwcmFjb3duaWsgPC0gaWZlbHNlKGlzLm5hKG91dCRwcmFjb3duaWspLCcnLGFzLmNoYXJhY3RlcihvdXQkcHJhY293bmlrKSkNCm91dCR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9hZG5vdGFjamUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfYWRub3RhY2plKSkNCm91dCRCTl9VUkwgPC0gaWZlbHNlKGlzLm5hKG91dCRCTl9VUkwpLCcnLGFzLmNoYXJhY3RlcihvdXQkQk5fVVJMKSkNCg0Kb3V0ICUkJSAgDQogICAgeyByZWtvcmRfQk49PWxhZyhyZWtvcmRfQk4sKSAmIHJ6X25hendhPT1sYWcocnpfbmF6d2EsKSAmIHphX3JvX3Jvaz09bGFnKHphX3JvX3JvaywpICYgemFfdHlwZT09bGFnKHphX3R5cGUsKSAmIHJ6X3JvZHphal9pZD09bGFnKHJ6X3JvZHphal9pZCwpICYgRFpfTkFaV0E9PWxhZyhEWl9OQVpXQSwpICYgRFpfRFpJQUxfSUQ9PWxhZyhEWl9EWklBTF9JRCwpICYgdHdfdHdvcmNhX2lkPT1sYWcodHdfdHdvcmNhX2lkLCkgJiB6YV90eXR1bD09bGFnKHphX3R5dHVsLCkgJiB6YV90eXR1bF9vcnlnaW5hbHU9PWxhZyh6YV90eXR1bF9vcnlnaW5hbHUsKSAmIHphX2plenlrX29yeWdpbmFsdT09bGFnKHphX2plenlrX29yeWdpbmFsdSwpICYgemFfb3Bpc193c3BvbHR3b3Jjb3c9PWxhZyh6YV9vcGlzX3dzcG9sdHdvcmNvdywpICYgemFfd3lkYW5pZT09bGFnKHphX3d5ZGFuaWUsKSAmIHphX3RvbXk9PWxhZyh6YV90b215LCkgJiB6YV9pbnN0eXR1Y2phPT1sYWcoemFfaW5zdHl0dWNqYSwpICYgemFfcm9rX3d5ZGFuaWE9PWxhZyh6YV9yb2tfd3lkYW5pYSwpICYgemFfb3Bpc19maXp5Y3pueV9rc2lhemtpPT1sYWcoemFfb3Bpc19maXp5Y3pueV9rc2lhemtpLCkgJiB6YV9zZXJpYV93eWRhd25pY3phPT1sYWcoemFfc2VyaWFfd3lkYXduaWN6YSwpICYgdHdfbmF6d2lza289PWxhZyh0d19uYXp3aXNrbywpICYgdHdfaW1pZT09bGFnKHR3X2ltaWUsKSAmIHByYWNvd25paz09bGFnKHByYWNvd25paywpICYgemFfYWRub3RhY2plPT1sYWcoemFfYWRub3RhY2plLCkgJiBCTl9VUkw9PWxhZyhCTl9VUkwsKX0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IG91dCRzYW1lDQpvdXQkc2FtZVsxXSA8LSAwDQpvdXQkZHppZWxvbmUgPC0gcGFzdGUob3V0JGFtX2F1dG9yX2lkLG91dCRhbV9uYXp3aXNrbyxvdXQkYW1faW1pZSxvdXQkb3Nfb3NvYmFfaWQsb3V0JG9zX25hendpc2tvLG91dCRvc19pbWllLG91dCRmb19zeW1ib2wsb3V0JHd5X3d5ZGF3bmljdHdvX2lkLG91dCR3eV9taWVqc2NlLG91dCR3eV9uYXp3YSxzZXAgPSAiIikNCg0Kb3V0IDwtIG91dCAlPiUNCiAgZmlsdGVyKCEoc2FtZT09MSZkemllbG9uZT09IiIpKSAlPiUNCiAgc2VsZWN0KDE6MzMpDQoNCm91dCAlJCUgIA0KICAgIHsgcmVrb3JkX0JOPT1sYWcocmVrb3JkX0JOLCkgJiByel9uYXp3YT09bGFnKHJ6X25hendhLCkgJiB6YV9yb19yb2s9PWxhZyh6YV9yb19yb2ssKSAmIHphX3R5cGU9PWxhZyh6YV90eXBlLCkgJiByel9yb2R6YWpfaWQ9PWxhZyhyel9yb2R6YWpfaWQsKSAmIERaX05BWldBPT1sYWcoRFpfTkFaV0EsKSAmIERaX0RaSUFMX0lEPT1sYWcoRFpfRFpJQUxfSUQsKSAmIHR3X3R3b3JjYV9pZD09bGFnKHR3X3R3b3JjYV9pZCwpICYgemFfdHl0dWw9PWxhZyh6YV90eXR1bCwpICYgemFfdHl0dWxfb3J5Z2luYWx1PT1sYWcoemFfdHl0dWxfb3J5Z2luYWx1LCkgJiB6YV9qZXp5a19vcnlnaW5hbHU9PWxhZyh6YV9qZXp5a19vcnlnaW5hbHUsKSAmIHphX29waXNfd3Nwb2x0d29yY293PT1sYWcoemFfb3Bpc193c3BvbHR3b3Jjb3csKSAmIHphX3d5ZGFuaWU9PWxhZyh6YV93eWRhbmllLCkgJiB6YV90b215PT1sYWcoemFfdG9teSwpICYgemFfaW5zdHl0dWNqYT09bGFnKHphX2luc3R5dHVjamEsKSAmIHphX3Jva193eWRhbmlhPT1sYWcoemFfcm9rX3d5ZGFuaWEsKSAmIHphX29waXNfZml6eWN6bnlfa3NpYXpraT09bGFnKHphX29waXNfZml6eWN6bnlfa3NpYXpraSwpICYgemFfc2VyaWFfd3lkYXduaWN6YT09bGFnKHphX3NlcmlhX3d5ZGF3bmljemEsKSAmIHR3X25hendpc2tvPT1sYWcodHdfbmF6d2lza28sKSAmIHR3X2ltaWU9PWxhZyh0d19pbWllLCkgJiBwcmFjb3duaWs9PWxhZyhwcmFjb3duaWssKSAmIHphX2Fkbm90YWNqZT09bGFnKHphX2Fkbm90YWNqZSwpICYgQk5fVVJMPT1sYWcoQk5fVVJMLCl9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiBvdXQkc2FtZQ0KDQojdWNpxJljaWUgemJ5dCBkxYJ1Z2ljaCBjacSFZ8OzdyB6bmFrw7N3LCBieSB3ZXN6xYJ5IGRvIG9yYWNsZSdhDQpkbHVnb3NjaSA8LSBkYXRhLmZyYW1lKHBvbGUgPSBjKCJhbV9uYXp3aXNrbyIsICJhbV9pbWllIiwgInphX3R5dHVsIiwgInphX3R5dHVsX29yeWdpbmFsdSIsICJ6YV9qZXp5a19vcnlnaW5hbHUiLCAib3NfbmF6d2lza28iLCAib3NfaW1pZSIsICJ6YV9vcGlzX3dzcG9sdHdvcmNvdyIsICJ6YV9pbnN0eXR1Y2phIiwgInd5X21pZWpzY2UiLCAid3lfbmF6d2EiLCAiemFfb3Bpc19maXp5Y3pueV9rc2lhemtpIiwgInphX3NlcmlhX3d5ZGF3bmljemEiLCAidHdfbmF6d2lza28iLCAidHdfaW1pZSIsICJ6YV9hZG5vdGFjamUiKSwgbGljemJhX3puYWtvdyA9IGMoNTAsNDAsNTAwLDUwMCwxMDAsNTAsNDAsNTAwLDI1NSw0MCwyNTUsMTAwMCwyNTUsMjAwLDQwLDIwMDApKQ0KeCA8LSBtYXRjaChkbHVnb3NjaSRwb2xlLG5hbWVzKG91dCkpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIGRsdWdvc2MgPC0gZGx1Z29zY2kkbGljemJhX3puYWtvd1ttYXRjaChuYW1lcyhvdXRbaV0pLGRsdWdvc2NpJHBvbGUpXQ0KICBvdXQkemFfYWRub3RhY2plIDwtIGlmZWxzZShkbHVnb3NjPG5jaGFyKGFzLmNoYXJhY3RlcihvdXRbLGldKSkmb3V0JHphX2Fkbm90YWNqZSE9IiIscGFzdGUob3V0JHphX2Fkbm90YWNqZSxwYXN0ZSgiVVdBR0EhIFBvbGUgIixhcy5jaGFyYWN0ZXIobmFtZXMob3V0W2ldKSksIiBiecWCbyB6Ynl0IGTFgnVnaWUgaSB6b3N0YcWCbyBwcnp5Y2nEmXRlLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksc2VwID0gIiMgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkbHVnb3NjPG5jaGFyKGFzLmNoYXJhY3RlcihvdXRbLGldKSkmb3V0JHphX2Fkbm90YWNqZT09IiIscGFzdGUoIlVXQUdBISBQb2xlICIsYXMuY2hhcmFjdGVyKG5hbWVzKG91dFtpXSkpLCIgYnnFgm8gemJ5dCBkxYJ1Z2llIGkgem9zdGHFgm8gcHJ6eWNpxJl0ZS4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLGFzLmNoYXJhY3RlcihvdXQkemFfYWRub3RhY2plKSkpDQogIA0KICBvdXRbLGldIDwtIGlmZWxzZShkbHVnb3NjPG5jaGFyKGFzLmNoYXJhY3RlcihvdXRbLGldKSksYXMuY2hhcmFjdGVyKHN1YnN0cihvdXRbLGldLDEsZGx1Z29zYykpLGFzLmNoYXJhY3RlcihvdXRbLGldKSkNCn0NCg0Kb3V0JHJla29yZF9CTltvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHJ6X25hendhW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfcm9fcm9rW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdHlwZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHJ6X3JvZHphal9pZFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JERaX05BWldBW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkRFpfRFpJQUxfSURbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR0d190d29yY2FfaWRbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90eXR1bFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3R5dHVsX29yeWdpbmFsdVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX2plenlrX29yeWdpbmFsdVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX29waXNfd3Nwb2x0d29yY293W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfd3lkYW5pZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3RvbXlbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9pbnN0eXR1Y2phW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfcm9rX3d5ZGFuaWFbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2lbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9zZXJpYV93eWRhd25pY3phW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkdHdfbmF6d2lza29bb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR0d19pbWllW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkcHJhY293bmlrW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfYWRub3RhY2plW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkQk5fVVJMW291dCRzYW1lID09IDFdIDwtICIiDQoNCm91dCA8LSBvdXQgJT4lDQogIHNlbGVjdCgxOjMzKQ0KDQojcMSZdGxhIHphcGlzdWrEhWNhIHBvIG9rLiAyMDAwIHdpZXJzenkgeiB1d3pnbMSZZG5pZW5pZW0ga29tcGxldG5vxZtjaSByZWtvcmTDs3cgYmlibGlvZ3JhZmljem55Y2ggcm96cGlzYW55Y2ggbmEga2lsa2Egd2llcnN6eQ0Kb3V0IDwtIG91dCAlPiUNCiAgbXV0YXRlKHBvZHppYWwgPSBpZmVsc2UocmVrb3JkX0JOIT0iIixhcy5jaGFyYWN0ZXIocmVrb3JkX0JOKSxOQSkpICU+JQ0KICBmaWxsKHBvZHppYWwpDQppbGUgPC0gdW5pcXVlKG91dCRwb2R6aWFsKQ0KaWxlIDwtIHNwbGl0KHVuaXF1ZShpbGUpLCBjZWlsaW5nKHNlcV9hbG9uZyh1bmlxdWUoaWxlKSkvMTUwMCkpDQojYWt0dWFsaXphY2phIC0gd3Bpc3ogd8WCYcWbY2l3eSByb2sgdyDFm2NpZcW8a8SZIHBsaWt1DQp4IDwtIDE6bGVuZ3RoKGlsZSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgZmluYWwgPC0gb3V0ICU+JQ0KICAgIGZpbHRlcihwb2R6aWFsICVpbiUgaWxlW1tpXV0pICU+JQ0KICAgIHNlbGVjdCgtcG9kemlhbCkNCiAgd3JpdGUueGxzeChmaW5hbCwgcGFzdGUoIkM6L1VzZXJzL0NlemFyeS9EZXNrdG9wLzIwMTFfYW50b2xvZ2llX2RvX2ltcG9ydHUiLGksIi54bHN4IixzZXAgPSAiIiksc2hlZXROYW1lID0gImdvdG93ZSIpDQp9DQpgYGANCg0KYGBge3Iga3NpxIXFvGtpIHdzcMOzxYJ3eWRhbmlhfQ0KYm5fb2sgPC0gY2h1bmsxMQ0KZGF0YSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0id3Nww7PFgnd5ZGFuaWUiKSAlPiUNCiAgbXV0YXRlKHJlZGFrdG9yX2R6aWFsdSA9IHBhc3RlKHJlZGFrdG9yX2R6aWFsdSwiX3dzcCIsc2VwID0gIiIpKQ0KDQojdXdvbG5pZW5pZSBrb2x1bW4geiBkYW55bWkgeiBibiBpIHByemV0d29yemVuaWUgZG8gUEJMDQojMTogemFfdXdhZ2ksIHJ6X25hendhLCB6YV9yb19yb2ssIHphX3R5cGUsIHJ6X3JvZHphal9pZCwgdHdfdHdvcmNhX2lkLCB0d19uYXp3aXNrbywgdHdfaW1pZSwgZHpfZHppYWxfaWQsIGR6X25hendhLCByZWRha3Rvcl9kemlhbHUNCnBvbGFfcGJsIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSwgUlpfTkFaV0EsIFpBX1JPX1JPSyA9IHJvaywgUlpfUk9EWkFKX0lELCBUV19UV09SQ0FfSUQsIFRXX05BWldJU0tPLCBUV19JTUlFLCBEWl9EWklBTF9JRCwgRFpfTkFaV0EsIHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIG11dGF0ZShaQV9UWVBFID0gIktTIikNCg0KIzI6IGF1dG9yDQpCTl9hdXRvciA8LSBkYXRhICU+JSANCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpICU+JSANCiAgbXV0YXRlKFgyNDUgPSBzdHJfZXh0cmFjdChYMjQ1LCAiKD88PVxcL1xcJGMpKC4qPykoPz0gO3wkKSIpLA0KICAgICAgICAgWDI0NSA9IHN0cl9yZW1vdmUoWDI0NSwiXFwuJCIpLA0KICAgICAgICAgWDI0NSA9IHN0cl9yZW1vdmUoWDI0NSwiXFxbIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCJcXF0iKSwNCiAgICAgICAgIEFNX05BWldJU0tPID0gaWZlbHNlKGdyZXBsKCIgW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5cXC5dKiAiLFgyNDUpLGFzLmNoYXJhY3RlcihYMjQ1KSxzdHJfcmVwbGFjZShYMjQ1LCIoXi4qPykoICkoPyEuKiApKC4qJCkiLCJcXDMiKSksDQogICAgICAgICBBTV9JTUlFID0gaWZlbHNlKGdyZXBsKCIgW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5cXC5dKiAiLFgyNDUpLCIqIixzdHJfcmVwbGFjZShYMjQ1LCIoXi4qPykoICkoPyEuKiApKC4qJCkiLCJcXDEiKSksDQogICAgICAgICBuYXp3YSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIocGFzdGUoQU1fTkFaV0lTS08sQU1fSU1JRSwgc2VwID0gIiIpKSwgIlxcVyIsICIiKSkgJT4lDQogIGxlZnRfam9pbiguLFBCTF9hdXRvcnp5ICU+JSBzZWxlY3QoQU1fQVVUT1JfSUQsQU1fS1JZUFRPTklNLEFNX0xJQ1pCQV9aQVBJU09XLG5hendhKSAlPiUgZmlsdGVyKGlzLm5hKEFNX0tSWVBUT05JTSkpLGJ5PSJuYXp3YSIpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLEFNX05BWldJU0tPLEFNX0lNSUUsLUFNX0xJQ1pCQV9aQVBJU09XKQ0KQk5fYXV0b3IkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX2F1dG9yWzE6NF0pKQ0KQk5fYXV0b3IgPC0gQk5fYXV0b3JbIWR1cGxpY2F0ZWQoQk5fYXV0b3IkaWRfZ3J1cHkpLF0gJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBOQSkgJT4lIA0KICBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSxaQV9BRE5PVEFDSkUsQU1fQVVUT1JfSUQpDQoNCiMzOiB0eXR1xYINCiNwb2xlIDI0NQ0KbWFyY19maWVsZF8yNDUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIn4iKSwNCiAgICAgICAgIFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ1PC1jYmluZChtYXJjX2ZpZWxkXzI0NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NSRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ1JFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ1JFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NSRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQppZigiJG4iICVpbiUgY29sbmFtZXMobWFyY19maWVsZF8yNDUpKSB7DQptYXJjX2ZpZWxkXzI0NSA8LSBtYXJjX2ZpZWxkXzI0NSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCxgJG5gLGAkcGApICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICAgYCRiYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGJgKSwiIixhcy5jaGFyYWN0ZXIoYCRiYCkpLGNvbGxhcHNlID0gIiAiKSwNCiAgICAgICAgIGAkbmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRuYCksIiIsYXMuY2hhcmFjdGVyKGAkbmApKSxjb2xsYXBzZSA9ICIgIiksDQogICAgICAgICBgJHBgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkcGApLCIiLGFzLmNoYXJhY3RlcihgJHBgKSksY29sbGFwc2UgPSAiICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgdW5pdGUoIlpBX1RZVFVMIixgJGFgOmAkcGAsc2VwID0gIiAiLG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoWkFfVFlUVUwgPSBzdHJfcmVwbGFjZV9hbGwoWkFfVFlUVUwsIiArIiwiICIpLA0KICAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVtb3ZlKFpBX1RZVFVMLCAiXFxzK1xcL1xcc3swLH0kIiksDQogICAgICAgICBaQV9UWVRVTCA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSxhcy5jaGFyYWN0ZXIoWkFfVFlUVUwpKSkpKSwNCiAgICAgICAgIFpBX1RZVFVMID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLGFzLmNoYXJhY3RlcihaQV9UWVRVTCkpKSkpLA0KICAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVwbGFjZV9hbGwoWkFfVFlUVUwsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiIDsgIiwiLiAiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gZ3N1YigiKCA6ICkoLikiLCIuIFxcVVxcMiIscGVybD1UUlVFLFpBX1RZVFVMKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxaQV9UWVRVTCkNCn0gZWxzZSB7DQogIG1hcmNfZmllbGRfMjQ1IDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGJgKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGFgKSwiIixhcy5jaGFyYWN0ZXIoYCRhYCkpLGNvbGxhcHNlID0gIiAiKSwNCiAgICAgICAgIGAkYmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSxjb2xsYXBzZSA9ICIgIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICB1bml0ZSgiWkFfVFlUVUwiLGAkYWA6YCRiYCxzZXAgPSAiICIsbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiICsiLCIgIiksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZW1vdmUoWkFfVFlUVUwsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLGFzLmNoYXJhY3RlcihaQV9UWVRVTCkpKSkpLA0KICAgICAgICAgWkFfVFlUVUwgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksYXMuY2hhcmFjdGVyKFpBX1RZVFVMKSkpKSksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCIgOyAiLCIuICIpLA0KICAgICAgICAgWkFfVFlUVUwgPSBnc3ViKCIoIDogKSguKSIsIi4gXFxVXFwyIixwZXJsPVRSVUUsWkFfVFlUVUwpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFpBX1RZVFVMKQ0KfQ0KdHl0dWxfd3Nwb2x3eWRhbmllIDwtIG1hcmNfZmllbGRfMjQ1DQojZG9waXNhbmllIGdhdHVua3UgZG8gcHJ6ZWRtaW90b3dlaiBuYSBwb2RzdGF3aWUgNjU1IGkgNjUwICANCmdhdHVua2lfcGJsIDwtIGRhdGEuZnJhbWUoZ2F0dW5layA9IGMoImFmb3J5em0iLCAiYWxidW0iLCAiYW50b2xvZ2lhIiwgImF1dG9iaW9ncmFmaWEiLCAiZHppZW5uaWsiLCAiZXNlaiIsICJmZWxpZXRvbiIsICJpbm5lIiwgImthemFuaWUiLCAibGlzdCIsICJtaW5pYXR1cmEgcHJvesSFIiwgIm9wb3dpYWRhbmllIiwgInBvZW1hdCIsICJwb3dpZcWbxIciLCAicHJvemEiLCAicHJvemEgcG9ldHlja2EiLCAicmVwb3J0YcW8IiwgInJvem15xZtsYW5pZSByZWxpZ2lqbmUiLCAicnlzdW5laywgb2JyYXoiLCAic2NlbmFyaXVzeiIsICJzemtpYyIsICJ0ZWtzdCBiaWJsaWpueSIsICJ0ZWtzdCBkcmFtYXR5Y3pueSIsICJkcmFtYXQiLCAid2llcnN6IiwgIndzcG9tbmllbmlhIiwgInd5cG93aWVkxboiLCAicGFtacSZdG5pa2kiLCAicG9lemphIiwgImxpdGVyYXR1cmEgcG9kcsOzxbxuaWN6YSIsICJzYXR5cmEiLCAicGlvc2Vua2EiKSkNCg0KI2RyYW1hdCwgcGFtacSZdG5pa2ksIHBvZXpqYSwgbGl0ZXJhdHVyYSBwb2Ryw7PFvG5pY3phLCBzYXR5cmEsIHBpb3NlbmthDQpnYXR1bmtpX2JuIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNjU1LFg2NTApDQoNCmdhdHVua2lfYm4gPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICAgICAgIGZyb20gZ2F0dW5raV9ibg0KICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gZ2F0dW5raV9wYmwgb24gbG93ZXIoZ2F0dW5raV9ibi5YNjU1KSBsaWtlICclJ3x8Z2F0dW5raV9wYmwuZ2F0dW5la3x8JyUnIikNCmdhdHVua2lfYm4gPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICAgICAgICAgZnJvbSBnYXR1bmtpX2JuDQogICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIGdhdHVua2lfcGJsIG9uIGxvd2VyKGdhdHVua2lfYm4uWDY1MCkgbGlrZSAnJSd8fGdhdHVua2lfcGJsLmdhdHVuZWt8fCclJyIpDQpjb2xuYW1lcyhnYXR1bmtpX2JuKVs1XSA8LSAiZ2F0dW5lazIiDQpnYXR1bmtpX2JuIDwtIGdhdHVua2lfYm4gJT4lDQogIG11dGF0ZShnYXR1bmVrID0gaWZlbHNlKGlzLm5hKGdhdHVuZWspJiFpcy5uYShnYXR1bmVrMiksYXMuY2hhcmFjdGVyKGdhdHVuZWsyKSxhcy5jaGFyYWN0ZXIoZ2F0dW5laykpLA0KICAgICAgICAgZ2F0dW5layA9IGlmZWxzZShncmVwbCgicHJ6eXBvd2llxZvEhyIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpJiFncmVwbCgiW155XXBvd2llxZvEhyIsWDY1NSkmZ2F0dW5laz09InBvd2llxZvEhyIsIm9wb3dpYWRhbmllIixhcy5jaGFyYWN0ZXIoZ2F0dW5laykpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShnYXR1bmVrKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxnYXR1bmVrKSAlPiUNCiAgbXV0YXRlKGdhdHVuZWsgPSBpZmVsc2UoZ2F0dW5laz09ImRyYW1hdCIsInRla3N0IGRyYW1hdHljem55IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdhdHVuZWs9PSJwYW1pxJl0bmlraSIsIndzcG9tbmllbmlhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnYXR1bmVrPT0icG9lemphIiwid2llcnN6IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2F0dW5laz09ImxpdGVyYXR1cmEgcG9kcsOzxbxuaWN6YSIsInJlcG9ydGHFvCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnYXR1bmVrPT0icGlvc2Vua2EiLCJ3aWVyc3oiLGFzLmNoYXJhY3RlcihnYXR1bmVrKSkpKSkpKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoZ2F0dW5layA9IHBhc3RlKGdhdHVuZWssY29sbGFwc2UgPSAiLCAiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShnYXR1bmVrID0gZ3N1YigiKF4uKSIsIlxcVVxcMSIscGVybCA9IFRSVUUsIGdhdHVuZWspKQ0KI3BvxYLEhWN6ZW5pZSB0eXR1xYJ1IHogZ2F0dW5raWVtDQp6YV90eXR1bCA8LSBtYXJjX2ZpZWxkXzI0NSAlPiUNCiAgbGVmdF9qb2luKC4sZ2F0dW5raV9ibixieT0iWkFfVVdBR0kiKSAlPiUgDQogIG11dGF0ZShnYXR1bmVrID0gcGFzdGUoIlsiLGdhdHVuZWssIl0iLHNlcCA9ICIiKSwNCiAgICAgICAgIGdhdHVuZWsgPSBpZmVsc2UoZ2F0dW5laz09IltOQV0iLE5BLGFzLmNoYXJhY3RlcihnYXR1bmVrKSkpICU+JSANCiAgdW5pdGUoIlpBX1RZVFVMIiwgWkFfVFlUVUw6Z2F0dW5laywgc2VwID0gIi4gIixuYS5ybT1UUlVFKSAlPiUgDQogIG11dGF0ZShaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiXFwuIFxcLiIsIi4gIiksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZXBsYWNlKFpBX1RZVFVMLCIoXFwhKShcXC4pfChcXD8pKFxcLikiLCJcXDEiKSkNCg0KIzQ6IHR5dHXFgiBvcnlnaW5hxYJ1DQojcG9sZSAyNDYNCm1hcmNfZmllbGRfMjQ2IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ2KSU+JQ0KICBmaWx0ZXIoWDI0NiE9IiIpICU+JQ0KICBtdXRhdGUoWDI0Nj1zdHJfcmVtb3ZlX2FsbChYMjQ2LCJ+IiksDQogICAgICAgICBYMjQ2PXN0cl9yZXBsYWNlX2FsbChYMjQ2LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDYiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NiE9IiIpICU+JQ0KICBtdXRhdGUoWDI0Nj1zdHJfcmVtb3ZlX2FsbChYMjQ2LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDYsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ2LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ2KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NjwtY2JpbmQobWFyY19maWVsZF8yNDYsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDYkWDI0NiA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NiRYMjQ2LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NlssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NiRYMjQ2KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDYkWDI0NiksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KaWYoIiRuIiAlaW4lIGNvbG5hbWVzKG1hcmNfZmllbGRfMjQ2KSkgew0KbWFyY19maWVsZF8yNDYgPC0gbWFyY19maWVsZF8yNDZbLCBjb2xTdW1zKGlzLm5hKG1hcmNfZmllbGRfMjQ2KSkgIT0gbnJvdyhtYXJjX2ZpZWxkXzI0NildICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIm9yeWciLFgyNDYpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCxgJG5gLGAkcGApICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiLCAiKSwNCiAgICAgICAgIGAkYmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSxjb2xsYXBzZSA9ICIiKSwNCiAgICAgICAgIGAkbmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRuYCksIiIsYXMuY2hhcmFjdGVyKGAkbmApKSxjb2xsYXBzZSA9ICIiKSwNCiAgICAgICAgIGAkcGAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRwYCksIiIsYXMuY2hhcmFjdGVyKGAkcGApKSxjb2xsYXBzZSA9ICIiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIHVuaXRlKCJYMjQ2IixgJGFgOmAkcGAsc2VwID0gIiAiLG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoWDI0NiA9IHN0cl9yZXBsYWNlX2FsbChYMjQ2LCIgKyIsIiAiKSwNCiAgICAgICAgIFgyNDYgPSBzdHJfcmVtb3ZlKFgyNDYsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFgyNDYgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksYXMuY2hhcmFjdGVyKFgyNDYpKSkpKSwNCiAgICAgICAgIFgyNDYgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApezAsMX0oLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLGFzLmNoYXJhY3RlcihYMjQ2KSkpKSksDQogICAgICAgICBYMjQ2ID0gc3RyX3JlcGxhY2VfYWxsKFgyNDYsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgICBYMjQ2ID0gZ3N1YigiKCA6ICkoLikiLCIuIFxcVVxcMiIscGVybD1UUlVFLFgyNDYpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLCBYMjQ2KQ0KfSBlbHNlIHsNCiAgbWFyY19maWVsZF8yNDYgPC0gbWFyY19maWVsZF8yNDZbLCBjb2xTdW1zKGlzLm5hKG1hcmNfZmllbGRfMjQ2KSkgIT0gbnJvdyhtYXJjX2ZpZWxkXzI0NildICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIm9yeWciLFgyNDYpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKGAkYWAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRhYCksIiIsYXMuY2hhcmFjdGVyKGAkYWApKSxjb2xsYXBzZSA9ICIsICIpLA0KICAgICAgICAgYCRiYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGJgKSwiIixhcy5jaGFyYWN0ZXIoYCRiYCkpLGNvbGxhcHNlID0gIiIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgdW5pdGUoIlgyNDYiLGAkYWA6YCRiYCxzZXAgPSAiICIsbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShYMjQ2ID0gc3RyX3JlcGxhY2VfYWxsKFgyNDYsIiArIiwiICIpLA0KICAgICAgICAgWDI0NiA9IHN0cl9yZW1vdmUoWDI0NiwgIlxccytcXC9cXHN7MCx9JCIpLA0KICAgICAgICAgWDI0NiA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICAgWDI0NiA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICl7MCwxfSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksYXMuY2hhcmFjdGVyKFgyNDYpKSkpKSwNCiAgICAgICAgIFgyNDYgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSwNCiAgICAgICAgIFgyNDYgPSBnc3ViKCIoIDogKSguKSIsIi4gXFxVXFwyIixwZXJsPVRSVUUsWDI0NikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIFgyNDYpDQp9DQoNCiNwb2xlIDUwMA0KbWFyY19maWVsZF81MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg1MDApJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZW1vdmVfYWxsKFg1MDAsIn4iKSwNCiAgICAgICAgIFg1MDA9c3RyX3JlcGxhY2VfYWxsKFg1MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDUwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZW1vdmVfYWxsKFg1MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDUwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTAwPC1jYmluZChtYXJjX2ZpZWxkXzUwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzUwMCRYNTAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTAwJFg1MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTAwJFg1MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzUwMCRYNTAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzUwMCA8LSBtYXJjX2ZpZWxkXzUwMCAlPiUNCiAgZmlsdGVyKGdyZXBsKCJvcnlnXFwuXFw6IixYNTAwKSkgJT4lDQogIG11dGF0ZShYNTAwID0gc3RyX3JlbW92ZShgJGFgLCJeVHl0XFwuIG9yeWdcXC46IHxeVHl0XFwsIG9yeWdcXC46IHxeLio/dHl0XFwuIG9yeWdcXC46ICIpLA0KICAgICAgICAgWDUwMCA9IHN0cl9yZW1vdmUoWDUwMCwgIlxccytcXC9cXHN7MCx9JCIpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDUwMCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDUwMCksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixYNTAwKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWDUwMCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDUwMCksYXMuY2hhcmFjdGVyKFg1MDApKSkpKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFg1MDApLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFg1MDApLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsWDUwMCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFg1MDApLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFg1MDApLGFzLmNoYXJhY3RlcihYNTAwKSkpKSksDQogICAgICAgICBYNTAwID0gc3RyX3JlcGxhY2VfYWxsKFg1MDAsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgICBYNTAwID0gc3RyX3JlbW92ZShYNTAwLCAiXFwuJCIpLA0KICAgICAgICAgWDUwMCA9IHN0cl9yZW1vdmUoWDUwMCwiKCx7MCwxfSB7MCwxfSlcXGR7NH0uKiR8KCwgdHwuIFQpeXQuIG9yeWcuIGN5a2x1OiIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg1MDApDQojdHl0dcWCIG9yeWdpbmHFgnUNCnphX3R5dHVsX29yeWdpbmFsdSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzI0NixieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF81MDAsYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShYNTAwID0gaWZlbHNlKGlzLm5hKFg1MDApLE5BLA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIm9yeWciLFg1MDApLE5BLGFzLmNoYXJhY3RlcihYNTAwKSkpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZSghaXMubmEoWDUwMCkmZ3JlcGwoIlxcLiAtICIsWDUwMCksc3RyX3JlcGxhY2UoWDUwMCwiKC4qPykoXFwuIC0gLiokKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihYNTAwKSksDQogICAgICAgICBYNTAwID0gaWZlbHNlKCFpcy5uYShYNTAwKSZncmVwbCgiTmEga3NpxIXFvGNlIHBzZXVkIixYNTAwKSxzdHJfcmVwbGFjZShYNTAwLCIoLio/KShcXC4gTmEga3NpxIXFvGNlIHBzZXVkLiokKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihYNTAwKSksDQogICAgICAgICBYNTAwID0gaWZlbHNlKCFpcy5uYShYNTAwKSZncmVwbCgiUHJ6ZWvFglxcLiB3ZyIsWDUwMCksc3RyX3JlcGxhY2UoWDUwMCwiKC4qPykoXFwuIFByemVrxYJcXC4gd2cuKiQpIiwiXFwxIiksYXMuY2hhcmFjdGVyKFg1MDApKSwNCiAgICAgICAgIFpBX1RZVFVMX09SWUdJTkFMVSA9IGlmZWxzZShpcy5uYShYMjQ2KSZpcy5uYShYNTAwKSxOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoIWlzLm5hKFg1MDApLGFzLmNoYXJhY3RlcihYNTAwKSxhcy5jaGFyYWN0ZXIoWDI0NikpKSwNCiAgICAgICAgIFpBX1RZVFVMX09SWUdJTkFMVSA9IHN0cl9yZW1vdmVfYWxsKFpBX1RZVFVMX09SWUdJTkFMVSwnXFwiJykpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWkFfVFlUVUxfT1JZR0lOQUxVKQ0KDQojNTogasSZenlrIG9yeWdpbmHFgnUNCm1hcmNfZmllbGRfMDQxIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMDQxKSU+JQ0KICBmaWx0ZXIoWDA0MSE9IiIpICU+JQ0KICBtdXRhdGUoWDA0MT1zdHJfcmVwbGFjZV9hbGwoWDA0MSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMDQxIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgwNDEhPSIiKSAlPiUNCiAgbXV0YXRlKFgwNDE9c3RyX3JlbW92ZV9hbGwoWDA0MSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMDQxLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDA0MSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzA0MSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8wNDE8LWNiaW5kKG1hcmNfZmllbGRfMDQxLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMDQxJFgwNDEgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8wNDEkWDA0MSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8wNDFbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8wNDEkWDA0MSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMDQxJFgwNDEpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCnphX2plenlrX29yeWdpbmFsdSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzA0MSAlPiUgc2VsZWN0KFpBX1VXQUdJLFpBX0pFWllLX09SWUdJTkFMVSA9IGAkYWApLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBtdXRhdGUoWkFfSkVaWUtfT1JZR0lOQUxVID0gc3RyX3JlcGxhY2VfYWxsKFpBX0pFWllLX09SWUdJTkFMVSwiXFwkYSIsIiwiKSkgJT4lDQogIHVuaXF1ZSgpDQoNCiM2OiB3c3DDs8WCdHfDs3JjeQ0KQk5fd3Nwb2x0d29yY2EgPC0gZGF0YSAlPiUgDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSAlPiUgDQogIG11dGF0ZSh3c3BvbHR3b3JjYSA9IHN0cl9yZW1vdmUoc3RyX3JlbW92ZV9hbGwoYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIig/PD07ICkoLiopKD89JCkiKSksIlxcLiQiKSwiY2hhcmFjdGVyXFwoMFxcKSIpLA0KICAgICAgICAgd3Nwb2x0d29yY2EgPSBzdHJfcmVtb3ZlX2FsbCh3c3BvbHR3b3JjYSwiIGV0IGFsXFwuIikpDQoNCm1hcmNfZmllbGRfNzAwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNzAwKSU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDcwMD1zdHJfcmVwbGFjZV9hbGwoWDcwMCwiKC4uXFwkYSkiLCJ8XFwxIiksDQogICAgICAgICBYNzAwPXN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg3MDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDcwMD1zdHJfcmVtb3ZlX2FsbChYNzAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg3MDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkgJT4lDQogIGZpbHRlcihYNzAwIT0iIikNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNzAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNzAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzcwMDwtY2JpbmQobWFyY19maWVsZF83MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF83MDAkWDcwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzcwMCRYNzAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzcwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzcwMCRYNzAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF83MDAkWDcwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzcwMCA8LSBtYXJjX2ZpZWxkXzcwMCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9zb2JhID0gYCRhYCxmdW5rY2phID0gYCRlYCkgJT4lDQogIGZpbHRlcighaXMubmEoZnVua2NqYSkpICU+JQ0KICBtdXRhdGUob3NvYmEgPSBzdHJfcmVtb3ZlKG9zb2JhLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpLA0KICAgICAgICAgb3NvYmEgPSBpZmVsc2UoIWdyZXBsKCIsIixvc29iYSkmc3RyX2NvdW50KG9zb2JhLCIgIik9PTEsc3RyX3JlcGxhY2Uob3NvYmEsIiAiLCIsICIpLGFzLmNoYXJhY3Rlcihvc29iYSkpLA0KICAgICAgICAgT1NfTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIob3NvYmEpKSwNCiAgICAgICAgIE9TX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDMiKSwiKiIpLA0KICAgICAgICAgd3NfcHJvc3R5ID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihvc29iYSksICJcXFciLCAiIiksDQogICAgICAgICBmdV9wcm9zdGEgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKGZ1bmtjamEpLCAiXFxXIiwgIiIpKQ0KDQpCTl93c3BvbHR3b3JjYSA8LSBCTl93c3BvbHR3b3JjYSAlPiUgDQogIGxlZnRfam9pbihtYXJjX2ZpZWxkXzcwMCxieT0iWkFfVVdBR0kiKQ0KDQp4IDwtIDE6bnJvdyhCTl93c3BvbHR3b3JjYSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIEJOX3dzcG9sdHdvcmNhJGN6eV9uYXp3aXNrb1tpXSA8LSBncmVwbChCTl93c3BvbHR3b3JjYSRPU19OQVpXSVNLT1tpXSxCTl93c3BvbHR3b3JjYSR3c3BvbHR3b3JjYVtpXSkNCiAgQk5fd3Nwb2x0d29yY2EkY3p5X2ltaWVbaV0gPC0gZ3JlcGwoQk5fd3Nwb2x0d29yY2EkT1NfSU1JRVtpXSxCTl93c3BvbHR3b3JjYSR3c3BvbHR3b3JjYVtpXSkNCn0NCg0KaWYgKGdyZXBsKCIwfDEiLEJOX3dzcG9sdHdvcmNhJGN6eV9uYXp3aXNrb1sxXSkpIHsNCiAgQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2EgJT4lIA0KICAgIGZpbHRlcihjenlfbmF6d2lza289PTF8Y3p5X2ltaWU9PTEpDQp9IGVsc2Ugew0KICBCTl93c3BvbHR3b3JjYSA8LSBCTl93c3BvbHR3b3JjYSAlPiUgDQogICAgZmlsdGVyKGN6eV9uYXp3aXNrbz09VFJVRXxjenlfaW1pZT09VFJVRSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2EgJT4lIA0KICBsZWZ0X2pvaW4oLixQQkxfd3Nwb2x0d29yY3kgJT4lIHNlbGVjdChPU19PU09CQV9JRCxPU19MSUNaQkFfWkFQSVNPVyxuYXp3YV9wcm9zdGEpLGJ5PWMoIndzX3Byb3N0eSI9Im5hendhX3Byb3N0YSIpKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLC1PU19MSUNaQkFfWkFQSVNPVykNCkJOX3dzcG9sdHdvcmNhJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZChCTl93c3BvbHR3b3JjYVsxOjRdKSkNCkJOX3dzcG9sdHdvcmNhIDwtIEJOX3dzcG9sdHdvcmNhWyFkdXBsaWNhdGVkKEJOX3dzcG9sdHdvcmNhJGlkX2dydXB5KSxdICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfZnVua2NqZSxieT1jKCJmdV9wcm9zdGEiPSJuYXp3YSIpKSAlPiUNCiAgbXV0YXRlKGZvX3N5bWJvbCA9IGlmZWxzZShmb19zeW1ib2w9PSJOVUxMIixOQSxhcy5jaGFyYWN0ZXIoZm9fc3ltYm9sKSksDQogICAgICAgICBaQV9BRE5PVEFDSkUgPSBOQSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phKQ0KDQojNzogb3BpcyB3c3DDs8WCdHfDs3Jjw7N3DQp6YV9vcGlzX3dzcG9sdHdvcmNvdyA8LSBCTl93c3BvbHR3b3JjYSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGZ1bmtjamEsT1NfSU1JRSxPU19OQVpXSVNLTykgJT4lIA0KICB1bml0ZSgiemFfb3Bpc193c3BvbHR3b3Jjb3ciLGMoZnVua2NqYSxPU19JTUlFLE9TX05BWldJU0tPKSxzZXAgPSAiICIsbmEucm0gPSBUUlVFKSAlPiUgDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKHphX29waXNfd3Nwb2x0d29yY293ID0gcGFzdGUoemFfb3Bpc193c3BvbHR3b3Jjb3csY29sbGFwc2UgPSAiLiAiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIHJpZ2h0X2pvaW4oLixkYXRhICU+JSBzZWxlY3QoWkFfVVdBR0kpLGJ5PSJaQV9VV0FHSSIpDQoNCiM4IHd5ZGFuaWUNCm1hcmNfZmllbGRfMjUwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjUwKSU+JQ0KICBmaWx0ZXIoWDI1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDI1MD1zdHJfcmVwbGFjZV9hbGwoWDI1MCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjUwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNTAhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNTA9c3RyX3JlbW92ZV9hbGwoWDI1MCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjUwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI1MCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI1MClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNTA8LWNiaW5kKG1hcmNfZmllbGRfMjUwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjUwJFgyNTAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNTAkWDI1MCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNTBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNTAkWDI1MCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjUwJFgyNTApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KemFfd3lkYW5pZSA8LSBtYXJjX2ZpZWxkXzI1MCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLCB3eWRhbmllID0gYCRhYCkgJT4lDQogIG11dGF0ZSh3eWRhbmllID0gc3RyX3JlbW92ZSh3eWRhbmllLCIgXFwvJCIpKSAlPiUNCiAgcmlnaHRfam9pbiguLGRhdGEgJT4lIHNlbGVjdChaQV9VV0FHSSksYnk9IlpBX1VXQUdJIikNCg0KIzk6IGluc3R5dHVjamEgc3ByYXdjemENCm1hcmNfZmllbGRfMjQ1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJ+IiksDQogICAgICAgICBYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQp6YV9pbnN0eXR1Y2phIDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NWM9YCRjYCkgJT4lDQogIGZpbHRlcighaXMubmEoWDI0NWMpKSAlPiUNCiAgbXV0YXRlKGluc3R5dHVjamEgPSBpZmVsc2UoZ3JlcGwoIlxcOyIsWDI0NWMpLHN0cl9yZXBsYWNlX2FsbChYMjQ1YywgIiguKj8pKFxcOyg/IS4qXFw7KSkoICkrKC4qPyQpIiwiXFw0IiksIiIpKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3Nwb2x0d29yY2EsYnk9IlpBX1VXQUdJIikNCg0KeCA8LSAxOmxlbmd0aHMoemFfaW5zdHl0dWNqYVsxXSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHphX2luc3R5dHVjamEkY3p5X25hendpc2tvW2ldIDwtIGdyZXBsKHphX2luc3R5dHVjamEkT1NfTkFaV0lTS09baV0semFfaW5zdHl0dWNqYSRYMjQ1Y1tpXSkNCiAgemFfaW5zdHl0dWNqYSRjenlfaW1pZVtpXSA8LSBncmVwbCh6YV9pbnN0eXR1Y2phJE9TX0lNSUVbaV0semFfaW5zdHl0dWNqYSRYMjQ1Y1tpXSkNCn0NCg0KemFfaW5zdHl0dWNqYSA8LSB6YV9pbnN0eXR1Y2phICU+JQ0KICBmaWx0ZXIoaXMubmEoY3p5X25hendpc2tvKSZpcy5uYShjenlfaW1pZSkpICU+JQ0KICBmaWx0ZXIoaW5zdHl0dWNqYSE9IiIpICU+JQ0KICBmaWx0ZXIoIWdyZXBsKCJeXFxbW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dfF5bYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iLGluc3R5dHVjamEpKSAlPiUNCiAgbXV0YXRlKGluc3R5dHVjamEgPSBzdHJfcmVtb3ZlKGluc3R5dHVjamEsIlxcLiQiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxpbnN0eXR1Y2phKSAlPiUNCiAgcmlnaHRfam9pbiguLGRhdGEgJT4lIHNlbGVjdChaQV9VV0FHSSksYnk9IlpBX1VXQUdJIikNCg0KIzEwOiB3eWRhd25pY3R3bw0KQk5fd3lkYXduaWN0d28gPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLCBYMjYwKSAlPiUNCiAgbXV0YXRlKFgyNjAgPSBzdHJfcmVwbGFjZV9hbGwoWDI2MCwic1xcLm5cXC4iLCAiYi53LiIpLCANCiAgICAgICAgIFgyNjAgPSBzdHJfcmVwbGFjZV9hbGwoWDI2MCwic1xcLmxcXC4iLCAiYi5tLiIpLCANCiAgICAgICAgIFgyNjAgPSBzdHJfcmVwbGFjZV9hbGwoWDI2MCwiU1xcLmxcXC4iLCAiYi5tLiIpLCANCiAgICAgICAgIFgyNjAgPSBzdHJfcmVtb3ZlKFgyNjAsIl5cXFxcKyIpLCANCiAgICAgICAgIHJva193eWRhbmlhID0gc3RyX2V4dHJhY3RfYWxsKFgyNjAsICIoPzw9XFwkYykuKig/PVxcJGUpfCg/PD1cXCRjKS4qIiksIA0KICAgICAgICAgYmV6X3Jva3UgPSBzdHJfcmVwbGFjZV9hbGwoWDI2MCwgIi5cXCRjLioiLCAiIiksIA0KICAgICAgICAgaWxlX3d5ZGF3bmljdHcgPSBzdHJfY291bnQoYmV6X3Jva3UsICJcXCRiIiksDQogICAgICAgICBpbGVfbWllanNjID0gc3RyX2NvdW50KGJlel9yb2t1LCAiXFwkYSIpLA0KICAgICAgICAga29sZWpub3NjID0gc3RyX3JlcGxhY2VfYWxsKGFzLmNoYXJhY3RlcihzdHJfZXh0cmFjdF9hbGwoYmV6X3Jva3UsICJcXCQuIikpLCAiW15hLXpdIiwgIiIpLA0KICAgICAgICAgYmV6X3Jva3UgPSBzdHJfcmVwbGFjZV9hbGwoYmV6X3Jva3UsICI7XFwkYiIsICI6JGIiKSwNCiAgICAgICAgIHd5ZGF3X3BvZHppZWwgPSBpZmVsc2UoaWxlX3d5ZGF3bmljdHc+aWxlX21pZWpzY3xrb2xlam5vc2M9PSJjYWFiYiIsIHN0cl9yZXBsYWNlX2FsbChiZXpfcm9rdSwgIihcXCRhKSguKj8pKCA6XFwkYi4qPykoIDpcXCRiKSIsICJcXDFcXDJcXDMgOyRhXFwyXFw0IiksYmV6X3Jva3UpLA0KICAgICAgICAgd3lkYXduaWN0d29fdGVzdCA9IHN0cl9yZXBsYWNlX2FsbCh3eWRhd19wb2R6aWVsLCAiKFxcJGIpKC4qPykoIDtcXCRhKSIsICJcXDFcXDJ8XFwzIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kscm9rX3d5ZGFuaWEsd3lkYXduaWN0d29fdGVzdCkgJT4lDQogIGNTcGxpdCguLCAid3lkYXduaWN0d29fdGVzdCIsIHNlcCA9ICJ8IiwgZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgbXV0YXRlKHd5ZGF3bmljdHdvID0gc3RyX2V4dHJhY3RfYWxsKHd5ZGF3bmljdHdvX3Rlc3QsICIoPzw9XFwkYikoLiopIiksDQogICAgICAgICBtaWVqc2NlX3d5ZGFuaWEgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX2V4dHJhY3RfYWxsKHd5ZGF3bmljdHdvX3Rlc3QsICIoPzw9XFwkYSkoLiopKD89IHswLDF9OiB7MCwxfVxcJGIpfCg/PD1cXCRhKSguKikoJCkiKSwiIDtcXCRhIiwgIiwgIiksDQogICAgICAgICBuYXp3YV9wcm9zdGEgPSBzdHJfdG9fbG93ZXIoc3RyX3JlcGxhY2VfYWxsKHN0cl9yZXBsYWNlX2FsbCh1bmxpc3Qod3lkYXduaWN0d29fdGVzdCksICJcXCRcXHciLCAiIiksICJcXFciLCAiIikpKSAlPiUNCiAgbGVmdF9qb2luKC4sUEJMX3d5ZGF3bmljdHdhLGJ5PSJuYXp3YV9wcm9zdGEiKSAlPiUNCiAgbXV0YXRlKHRvX3NhbW8gPSB3eWRhd25pY3R3bz09V1lfTkFaV0EpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLC10b19zYW1vLC1XWV9MSUNaQkFfWkFQSVNPVykNCkJOX3d5ZGF3bmljdHdvJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZChCTl93eWRhd25pY3R3b1sxOjNdKSkNCkJOX3d5ZGF3bmljdHdvIDwtIEJOX3d5ZGF3bmljdHdvWyFkdXBsaWNhdGVkKEJOX3d5ZGF3bmljdHdvJGlkX2dydXB5KSxdICU+JQ0KICBtdXRhdGUoV1lfTkFaV0EgPSBpZmVsc2UoIWlzLm5hKFdZX05BWldBKSxhcy5jaGFyYWN0ZXIoV1lfTkFaV0EpLGFzLmNoYXJhY3Rlcih3eWRhd25pY3R3bykpLA0KICAgICAgICAgV1lfTUlBU1RPID0gaWZlbHNlKCFpcy5uYShXWV9NSUFTVE8pLGFzLmNoYXJhY3RlcihXWV9NSUFTVE8pLGFzLmNoYXJhY3RlcihtaWVqc2NlX3d5ZGFuaWEpKSwNCiAgICAgICAgIHJva193eWRhbmlhID0gc3RyX3JlcGxhY2VfYWxsKHJva193eWRhbmlhLCAiKC4qKShcXC4pIiwgIlxcMSIpLA0KICAgICAgICAgemFfcm9rX3d5ZGFuaWEgPSBpZmVsc2UobmNoYXIocm9rX3d5ZGFuaWEpPT00LGFzLmNoYXJhY3Rlcihyb2tfd3lkYW5pYSksTkEpLA0KICAgICAgICAgZG9fb3Bpc3UgPSBpZmVsc2UoaXMubmEoemFfcm9rX3d5ZGFuaWEpLHBhc3RlKCJbIixzdHJfZXh0cmFjdChyb2tfd3lkYW5pYSwiXFxkezR9IiksIl0iLHNlcCA9ICIiKSwiIiksDQogICAgICAgICBXWV9NSUFTVE8gPSBpZmVsc2Uoc3Vic3RyKFdZX01JQVNUTywxLDEpPT0iWyImc3Vic3RyKFdZX01JQVNUTyxuY2hhcihXWV9NSUFTVE8pLG5jaGFyKFdZX01JQVNUTykpIT0iXSImaXMubmEoV1lfV1lEQVdOSUNUV09fSUQpLHBhc3RlKHRyaW0oV1lfTUlBU1RPKSwiXSIsc2VwID0gIiIpLGFzLmNoYXJhY3RlcihXWV9NSUFTVE8pKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxXWV9XWURBV05JQ1RXT19JRCxXWV9OQVpXQSxXWV9NSUFTVE8semFfcm9rX3d5ZGFuaWEsZG9fb3Bpc3UpDQoNCiMxMTogb3BpcyBmaXp5Y3pueSBrc2nEhcW8a2kNCiNwb2xlIDMwMCBkbyBvcGlzdSBmaXp5Y3puZWdvDQptYXJjX2ZpZWxkXzMwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDMwMCklPiUNCiAgZmlsdGVyKFgzMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgzMDA9c3RyX3JlcGxhY2VfYWxsKFgzMDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDMwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMzAwIT0iIikgJT4lDQogIG11dGF0ZShYMzAwPXN0cl9yZW1vdmVfYWxsKFgzMDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDMwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgzMDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8zMDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMzAwPC1jYmluZChtYXJjX2ZpZWxkXzMwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzMwMCRYMzAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMzAwJFgzMDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMzAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMzAwJFgzMDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzMwMCRYMzAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCmlmKCIkZSIgJWluJSBjb2xuYW1lcyhtYXJjX2ZpZWxkXzMwMCkpIHsNCm1hcmNfZmllbGRfMzAwIDwtIG1hcmNfZmllbGRfMzAwICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpLA0KICAgICAgICAgYCRiYCA9IHN0cl9yZW1vdmUoYCRiYCwiIFxcOyskfCBcXDorJCIpLA0KICAgICAgICAgYCRlYCA9IGlmZWxzZShncmVwbCgiQ0QtUk9NfERWRHxWQ0R8Q0QiLGAkZWApJmdyZXBsKCJcXCsgZHlza3xwxYJ5dCIsYCRlYCksc3RyX2V4dHJhY3QoYCRlYCwiKD88PVxcKykoZHlza3xwxYJ5dC4qPykoQ0QtUk9NfERWRHxWQ0R8Q0QpKFxcKSl7MCwxfSIpLA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIkNELVJPTXxEVkR8VkNEfENEIixgJGVgKSxzdHJfZXh0cmFjdChgJGVgLCIoXi4qPykoQ0QtUk9NfERWRHxWQ0R8Q0QpKFxcKSl7MCwxfSIpLE5BKSksDQogICAgICAgICBgJGFgID0gaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksDQogICAgICAgICBgJGJgID0gaWZlbHNlKGlzLm5hKGAkYmApLCIiLGFzLmNoYXJhY3RlcihgJGJgKSksDQogICAgICAgICBgJGVgID0gaWZlbHNlKGlzLm5hKGAkZWApLCIiLGFzLmNoYXJhY3RlcihgJGVgKSkpDQp9IGVsc2Ugew0KICBtYXJjX2ZpZWxkXzMwMCA8LSBtYXJjX2ZpZWxkXzMwMCAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSwNCiAgICAgICAgIGAkYmAgPSBzdHJfcmVtb3ZlKGAkYmAsIiBcXDsrJHwgXFw6KyQiKSwNCiAgICAgICAgIGAkYWAgPSBpZmVsc2UoaXMubmEoYCRhYCksIiIsYXMuY2hhcmFjdGVyKGAkYWApKSwNCiAgICAgICAgIGAkYmAgPSBpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSkNCn0NCiNwb2xlIDUwMCBkbyBvcGlzdSBmaXp5Y3puZWdvDQptYXJjX2ZpZWxkXzUwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDUwMCklPiUNCiAgZmlsdGVyKFg1MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDA9c3RyX3JlcGxhY2VfYWxsKFg1MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDUwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZW1vdmVfYWxsKFg1MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDUwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTAwPC1jYmluZChtYXJjX2ZpZWxkXzUwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzUwMCRYNTAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTAwJFg1MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTAwJFg1MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzUwMCRYNTAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzUwMCA8LSBtYXJjX2ZpZWxkXzUwMCAlPiUNCiAgbXV0YXRlKGAkYWAgPSBpZmVsc2UoZ3JlcGwoIm9yeWcoXFwufFxcLCkiLFg1MDApJmdyZXBsKCJwc2V1ZHxuYXp3YSIsWDUwMCxpZ25vcmUuY2FzZSA9IFRSVUUpLHN0cl9yZXBsYWNlKGAkYWAsIiheLio/KShcXC4gKShcXHB7THV9LiokKSIsIlxcMyIpLGFzLmNoYXJhY3RlcihgJGFgKSkpICU+JSANCiAgZmlsdGVyKCFncmVwbCgib3J5ZyhcXC58XFwsKSIsYCRhYCkmZ3JlcGwoInBzZXVkfG5hendhfGRvdHljenxwb2wiLGAkYWAsaWdub3JlLmNhc2UgPSBUUlVFKSkgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIgXFw7KyR8IFxcOiskIikpDQogIA0KI3BvbGUgNTQ2IGRvIG9waXN1IGZpenljem5lZ28NCm1hcmNfZmllbGRfNTQ2IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNTQ2KSU+JQ0KICBmaWx0ZXIoWDU0NiE9IiIpICU+JQ0KICBtdXRhdGUoWDU0Nj1zdHJfcmVwbGFjZV9hbGwoWDU0NiwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNTQ2IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg1NDYhPSIiKSAlPiUNCiAgbXV0YXRlKFg1NDY9c3RyX3JlbW92ZV9hbGwoWDU0NiwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNTQ2LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDU0NiwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzU0NilbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF81NDY8LWNiaW5kKG1hcmNfZmllbGRfNTQ2LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNTQ2JFg1NDYgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF81NDYkWDU0NixzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF81NDZbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF81NDYkWDU0Niksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNTQ2JFg1NDYpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfNTQ2IDwtIG1hcmNfZmllbGRfNTQ2ICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpKQ0KDQppZigiJGUiICVpbiUgY29sbmFtZXMobWFyY19maWVsZF8zMDApKSB7DQp6YV9vcGlzX2tzIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX3d5ZGF3bmljdHdvICU+JSBzZWxlY3QoWkFfVVdBR0ksZG9fb3Bpc3UpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzMwMCAlPiUgc2VsZWN0KFpBX1VXQUdJLFgzMDBhPWAkYWAsWDMwMGI9YCRiYCxYMzAwZT1gJGVgKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF81MDAgJT4lIHNlbGVjdChaQV9VV0FHSSxYNTAwYT1gJGFgKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF81NDYgJT4lIHNlbGVjdChaQV9VV0FHSSxYNTQ2YT1gJGFgKSxieT0iWkFfVVdBR0kiKQ0KemFfb3Bpc19rc1tpcy5uYSh6YV9vcGlzX2tzKV0gIDwtICIiDQp6YV9vcGlzX2tzIDwtIHphX29waXNfa3MgJT4lDQogIG11dGF0ZSh6YV9vcGlzX2tzID0gcGFzdGUoaWZlbHNlKGRvX29waXN1IT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoZG9fb3Bpc3UpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDMwMGEhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYMzAwYSksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYMzAwYiE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKFgzMDBiKSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFgzMDBlIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDMwMGUpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDUwMGEhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYNTAwYSksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYNTQ2YSE9IiIsYXMuY2hhcmFjdGVyKFg1NDZhKSwiIiksc2VwID0gIiIpLA0KICAgICAgICAgemFfb3Bpc19rcyA9IHN0cl9yZW1vdmUoemFfb3Bpc19rcywiKCwgKSskIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksemFfb3Bpc19rcykgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLC1uY2hhcih6YV9vcGlzX2tzKSkNCn0gZWxzZSB7DQogIHphX29waXNfa3MgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3lkYXduaWN0d28gJT4lIHNlbGVjdChaQV9VV0FHSSxkb19vcGlzdSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMzAwICU+JSBzZWxlY3QoWkFfVVdBR0ksWDMwMGE9YCRhYCxYMzAwYj1gJGJgKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF81MDAgJT4lIHNlbGVjdChaQV9VV0FHSSxYNTAwYT1gJGFgKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF81NDYgJT4lIHNlbGVjdChaQV9VV0FHSSxYNTQ2YT1gJGFgKSxieT0iWkFfVVdBR0kiKQ0KemFfb3Bpc19rc1tpcy5uYSh6YV9vcGlzX2tzKV0gIDwtICIiDQp6YV9vcGlzX2tzIDwtIHphX29waXNfa3MgJT4lDQogIG11dGF0ZSh6YV9vcGlzX2tzID0gcGFzdGUoaWZlbHNlKGRvX29waXN1IT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoZG9fb3Bpc3UpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDMwMGEhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYMzAwYSksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYMzAwYiE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKFgzMDBiKSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFg1MDBhIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDUwMGEpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDU0NmEhPSIiLGFzLmNoYXJhY3RlcihYNTQ2YSksIiIpLHNlcCA9ICIiKSwNCiAgICAgICAgIHphX29waXNfa3MgPSBzdHJfcmVtb3ZlKHphX29waXNfa3MsIigsICkrJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHphX29waXNfa3MpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSwtbmNoYXIoemFfb3Bpc19rcykpDQp9DQp6YV9vcGlzX2tzJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZCh6YV9vcGlzX2tzWzFdKSkNCnphX29waXNfa3MgPC0gemFfb3Bpc19rc1shZHVwbGljYXRlZCh6YV9vcGlzX2tzJGlkX2dydXB5KSxdICU+JQ0KICBzZWxlY3QoLWlkX2dydXB5KQ0KDQp3c3BfaW5mbyA8LSB6YV9vcGlzX2tzICU+JSANCiAgbGVmdF9qb2luKHR5dHVsX3dzcG9sd3lkYW5pZSxieT0iWkFfVVdBR0kiKSAlPiUgDQogIGxlZnRfam9pbihCTl9hdXRvcixieT0iWkFfVVdBR0kiKSAlPiUgDQogIG11dGF0ZSh3c3AgPSBwYXN0ZSgiW1dzcMOzxYJ3eWQuOiAiLGlmZWxzZShBTV9JTUlFPT0iKiIsIiIsQU1fSU1JRSksIiAiLEFNX05BWldJU0tPLCI6ICIsWkFfVFlUVUwsIl0iLCBzZXAgPSAiIiksDQogICAgICAgICB6YV91d2FnaTIgPSBzdHJfcmVtb3ZlX2FsbChaQV9VV0FHSSwiLiQiKSkNCg0Kd3NwX2luZm8gJSQlICANCiAgICB7IHphX3V3YWdpMiA9PSBkcGx5cjo6bGFnKHphX3V3YWdpMiwgMSl9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiB3c3BfaW5mbyRzYW1lDQp3c3BfaW5mbyRzYW1lWzFdIDwtIDANCg0Kd3NwX2luZm8gPC0gd3NwX2luZm8gJT4lIA0KICBhcnJhbmdlKHphX3V3YWdpMiwtc2FtZSkNCg0KemFfb3Bpc19rcyA8LSB6YV9vcGlzX2tzICU+JSANCiAgYmluZF9jb2xzKHdzcF9pbmZvICU+JSBzZWxlY3Qod3NwKSkNCg0KIzEyOiBzZXJpYSB3eWRhd25pY3phDQptYXJjX2ZpZWxkXzQ5MCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDQ5MCxYODAwLFg4MzApICU+JQ0KICBtdXRhdGUoWDQ5MCA9IGlmZWxzZShncmVwbCgiVVxcKyIsWDQ5MCksYXMuY2hhcmFjdGVyKFg4MzApLGFzLmNoYXJhY3RlcihYNDkwKSkpICU+JQ0KICBtdXRhdGUoWDgwMCA9IGlmZWxzZShYNDkwIT0iIiwiIixhcy5jaGFyYWN0ZXIoWDgwMCkpLA0KICAgICAgICAgWDgzMCA9IGlmZWxzZShYNDkwIT0iIiwiIixhcy5jaGFyYWN0ZXIoWDgzMCkpLA0KICAgICAgICAgWDgwMCA9IHN0cl9yZXBsYWNlKFg4MDAsIihcXCRhKSguKikoXFwkdCkiLCJcXDEiKSwNCiAgICAgICAgIFg0OTAgPSBpZmVsc2UoWDQ5MD09IiImWDgzMCE9IiIsYXMuY2hhcmFjdGVyKFg4MzApLA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWDQ5MD09IiImWDgwMCE9IiIsYXMuY2hhcmFjdGVyKFg4MDApLGFzLmNoYXJhY3RlcihYNDkwKSkpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg0OTApICU+JQ0KICBmaWx0ZXIoWDQ5MCE9IiIpICU+JQ0KICBtdXRhdGUoWDQ5MD1zdHJfcmVwbGFjZV9hbGwoWDQ5MCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNDkwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg0OTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg0OTA9c3RyX3JlbW92ZV9hbGwoWDQ5MCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNDkwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDQ5MCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzQ5MClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF80OTA8LWNiaW5kKG1hcmNfZmllbGRfNDkwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNDkwJFg0OTAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF80OTAkWDQ5MCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF80OTBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF80OTAkWDQ5MCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNDkwJFg0OTApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCnphX3NlcmlhX3d5ZGF3bmljemEgPC0gbWFyY19maWVsZF80OTAgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlcGxhY2VfYWxsKGAkYWAsIig9KShcXCRhKSIsIlxcMSAiKSwNCiAgICAgICAgIGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSwNCiAgICAgICAgIGAkdmAgPSBpZmVsc2UoaXMubmEoYCR2YCksIiIsYXMuY2hhcmFjdGVyKGAkdmApKSkgJT4lDQogIGZpbHRlcighaXMubmEoYCRhYCkpICU+JQ0KICBtdXRhdGUoc2VyaWEgPSBzdHJfcmVtb3ZlKHBhc3RlKCIoIixgJGFgLCI7ICIsYCR2YCwiKSIsc2VwID0gIiIpLCI7ICg/PVxcKSQpIiksDQogICAgICAgICBzZXJpYSA9IGdzdWIoIiggOiApKC4pIiwiLiBcXFVcXDIiLHBlcmw9VFJVRSxzZXJpYSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksc2VyaWEpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShzZXJpYSA9IHBhc3RlKHNlcmlhLGNvbGxhcHNlID0gIiAiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShzZXJpYSA9IHN0cl9yZXBsYWNlX2FsbChzZXJpYSwiXFwkLiIsIjsgIikpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMTM6IHRvbXkNCnphX3RvbXkgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKHphX3RvbXkgPSBOQSkNCg0KIzE0OiBhZG5vdGFjamUNCnphX2Fkbm90YWNqZSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9hdXRvciAlPiUgc2VsZWN0KFpBX1VXQUdJLFpBX0FETk9UQUNKRSksYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBpZmVsc2UoaXMubmEoWkFfQUROT1RBQ0pFKSwiIixwYXN0ZShhcy5jaGFyYWN0ZXIoWkFfQUROT1RBQ0pFKSwiIyAiLHNlcCA9ICIiKSksDQogICAgICAgICBaQV9BRE5PVEFDSkUgPSBzdHJfcmVtb3ZlKFpBX0FETk9UQUNKRSwiKCMgKSskIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWkFfQUROT1RBQ0pFKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLW5jaGFyKFpBX0FETk9UQUNKRSkpDQp6YV9hZG5vdGFjamUkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKHphX2Fkbm90YWNqZVsxXSkpDQp6YV9hZG5vdGFjamUgPC0gemFfYWRub3RhY2plWyFkdXBsaWNhdGVkKHphX2Fkbm90YWNqZSRpZF9ncnVweSksXSAlPiUNCiAgc2VsZWN0KC1pZF9ncnVweSkNCg0KIzE1OiBCTl9VUkwNCkJOX1VSTCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQk5fVVJMKQ0KDQojd3lyw7N3bmFuaWUgbGljemJ5IHdpZXJzenkgZG8gbGljemJ5IHdpZXJzenkgb2JpZWt0dSBkYXRhDQpCTl9hdXRvciA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9hdXRvciAlPiUgc2VsZWN0KFpBX1VXQUdJLEFNX0FVVE9SX0lELEFNX05BWldJU0tPLEFNX0lNSUUpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBkZHBseSguLCAuKFpBX1VXQUdJKSwgc3VtbWFyaXplLCBBTV9BVVRPUl9JRCA9IHBhc3RlKEFNX0FVVE9SX0lELCBjb2xsYXBzZT0ifCIpLCBBTV9OQVpXSVNLTyA9IHBhc3RlKEFNX05BWldJU0tPLCBjb2xsYXBzZT0ifCIpLCBBTV9JTUlFID0gcGFzdGUoQU1fSU1JRSwgY29sbGFwc2U9InwiKSkNCkJOX3dzcG9sdHdvcmNhIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX3dzcG9sdHdvcmNhICU+JSBzZWxlY3QoWkFfVVdBR0ksT1NfT1NPQkFfSUQsT1NfTkFaV0lTS08sT1NfSU1JRSxmb19zeW1ib2wpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBkZHBseSguLCAuKFpBX1VXQUdJKSwgc3VtbWFyaXplLCBPU19PU09CQV9JRCA9IHBhc3RlKE9TX09TT0JBX0lELCBjb2xsYXBzZT0ifCIpLCBPU19OQVpXSVNLTyA9IHBhc3RlKE9TX05BWldJU0tPLCBjb2xsYXBzZT0ifCIpLCBPU19JTUlFID0gcGFzdGUoT1NfSU1JRSwgY29sbGFwc2U9InwiKSwgZm9fc3ltYm9sID0gcGFzdGUoZm9fc3ltYm9sLCBjb2xsYXBzZT0ifCIpKSAlPiUNCiAgbXV0YXRlKGZvX3N5bWJvbCA9IGlmZWxzZShmb19zeW1ib2w9PSJOVUxMIiwiTkEiLGFzLmNoYXJhY3Rlcihmb19zeW1ib2wpKSkNCkJOX3d5ZGF3bmljdHdvIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX3d5ZGF3bmljdHdvICU+JSBzZWxlY3QoWkFfVVdBR0ksV1lfV1lEQVdOSUNUV09fSUQsV1lfTkFaV0EsV1lfTUlBU1RPLHphX3Jva193eWRhbmlhKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgZGRwbHkoLiwgLihaQV9VV0FHSSksIHN1bW1hcml6ZSwgV1lfV1lEQVdOSUNUV09fSUQgPSBwYXN0ZShXWV9XWURBV05JQ1RXT19JRCwgY29sbGFwc2U9InwiKSwgV1lfTkFaV0EgPSBwYXN0ZShXWV9OQVpXQSwgY29sbGFwc2U9InwiKSwgV1lfTUlBU1RPID0gcGFzdGUoV1lfTUlBU1RPLCBjb2xsYXBzZT0ifCIpLCB6YV9yb2tfd3lkYW5pYSA9IHBhc3RlKHVuaXF1ZSh6YV9yb2tfd3lkYW5pYSksIGNvbGxhcHNlPSJ8IikpICU+JQ0KICBtdXRhdGUoemFfcm9rX3d5ZGFuaWEgPSBpZmVsc2UoemFfcm9rX3d5ZGFuaWE9PSJOQSIsIiIsYXMuaW50ZWdlcih6YV9yb2tfd3lkYW5pYSkpKQ0KDQojcG/FgsSFY3plbmllIHdzenlzdGtpY2ggZWxlbWVudMOzdyB3IGplZG7EhSB0YWJlbMSZDQprb2xlam5vc2MgPC0gZGF0YS5mcmFtZShrb2xlam5vc2M9YygiWkFfVVdBR0kiLCJSWl9OQVpXQSIsIlpBX1JPX1JPSyIsIlpBX1RZUEUiLCJSWl9ST0RaQUpfSUQiLCJEWl9OQVpXQSIsIkRaX0RaSUFMX0lEIiwiVFdfVFdPUkNBX0lEIiwiQU1fQVVUT1JfSUQiLCJBTV9OQVpXSVNLTyIsIkFNX0lNSUUiLCJaQV9UWVRVTCIsIlpBX1RZVFVMX09SWUdJTkFMVSIsIlpBX0pFWllLX09SWUdJTkFMVSIsIk9TX09TT0JBX0lEIiwiT1NfTkFaV0lTS08iLCJPU19JTUlFIiwiZm9fc3ltYm9sIiwiemFfb3Bpc193c3BvbHR3b3Jjb3ciLCJ3eWRhbmllIiwiemFfdG9teSIsImluc3R5dHVjamEiLCJXWV9XWURBV05JQ1RXT19JRCIsIldZX01JQVNUTyIsIldZX05BWldBIiwiemFfcm9rX3d5ZGFuaWEiLCJ6YV9vcGlzX2tzIiwic2VyaWEiLCJUV19OQVpXSVNLTyIsIlRXX0lNSUUiLCJyZWRha3Rvcl9kemlhbHUiLCJaQV9BRE5PVEFDSkUiLCJCTl9VUkwiKSkNCnBvbGFjem9uZSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixwb2xhX3BibCxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9hdXRvcixieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV90eXR1bCxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV90eXR1bF9vcnlnaW5hbHUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfamV6eWtfb3J5Z2luYWx1LGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX3dzcG9sdHdvcmNhLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX29waXNfd3Nwb2x0d29yY293LGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3d5ZGFuaWUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfaW5zdHl0dWNqYSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93eWRhd25pY3R3byxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9vcGlzX2tzLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3NlcmlhX3d5ZGF3bmljemEsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfdG9teSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9hZG5vdGFjamUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fVVJMLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIHNlbGVjdChhcy52ZWN0b3Ioa29sZWpub3NjJGtvbGVqbm9zYykpDQpjb2xuYW1lcyhwb2xhY3pvbmUpIDwtIGMoInJla29yZF9CTiIsInJ6X25hendhIiwiemFfcm9fcm9rIiwiemFfdHlwZSIsInJ6X3JvZHphal9pZCIsIkRaX05BWldBIiwiRFpfRFpJQUxfSUQiLCJ0d190d29yY2FfaWQiLCJhbV9hdXRvcl9pZCIsImFtX25hendpc2tvIiwiYW1faW1pZSIsInphX3R5dHVsIiwiemFfdHl0dWxfb3J5Z2luYWx1IiwiemFfamV6eWtfb3J5Z2luYWx1Iiwib3Nfb3NvYmFfaWQiLCJvc19uYXp3aXNrbyIsIm9zX2ltaWUiLCJmb19zeW1ib2wiLCJ6YV9vcGlzX3dzcG9sdHdvcmNvdyIsInphX3d5ZGFuaWUiLCJ6YV90b215IiwiemFfaW5zdHl0dWNqYSIsInd5X3d5ZGF3bmljdHdvX2lkIiwid3lfbWllanNjZSIsInd5X25hendhIiwiemFfcm9rX3d5ZGFuaWEiLCJ6YV9vcGlzX2Zpenljem55X2tzaWF6a2kiLCJ6YV9zZXJpYV93eWRhd25pY3phIiwidHdfbmF6d2lza28iLCJ0d19pbWllIiwicHJhY293bmlrIiwiemFfYWRub3RhY2plIiwiQk5fVVJMIikNCg0KI3phc3lnbmFsaXpvd2FuaWUgbmllcG9wcmF3bmVnbyBrb2Rvd2FuaWENCnggPC0gMToobGVuZ3RoKHBvbGFjem9uZSktMikNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgcG9sYWN6b25lJHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZ3JlcGwoIjxVXFwrKC4uLi4pPiIscG9sYWN6b25lWyxpXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSE9MCxwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgQsWCxIVkIGtvZG93YW5pYSB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiBabmFqZMW6IGZyYXrEmSBcIj8/P1wiIGkgenJlZGFndWogcG9sZS4iLHNlcCA9ICIiKSxzZXAgPSAiIyAiKSxwYXN0ZSgiVVdBR0EhIELFgsSFZCBrb2Rvd2FuaWEgdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgWm5hamTFuiBmcmF6xJkgXCI/Pz9cIiBpIHpyZWRhZ3VqIHBvbGUuIixzZXAgPSAiIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCiAgcG9sYWN6b25lWyxpXSA8LSBnc3ViKCI8VVxcKyguLi4uKT4iLCAiPz8/IiwgcG9sYWN6b25lWyxpXSkNCn0NCiN6YXN5Z25hbGl6b3dhbmllIG9iZWNub8WbY2kgem5ha3UgJCB3IGt0w7NyeW3FmyB6IHDDs2wNClggPC0gMToobGVuZ3RoKHBvbGFjem9uZSktMikNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgcG9sYWN6b25lJHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZ3JlcGwoIlxcJCIscG9sYWN6b25lWyxpXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKT09MCxwYXN0ZSgiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGLFgsSZZG55IHphcGlzIEJOIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIHd5ZHJ1a293YW5vIHpuYWsgXCIkXCIuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gem5hayBcIiRcIi4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHNlcCA9ICIjICIpKSxhcy5jaGFyYWN0ZXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkpDQp9DQojemFzeWduYWxpem93YW5pZSBvYmVjbm/Fm2NpIGZyYXp5ICJjaGFyYWN0ZXIoMCkiIHcga3TDs3J5bcWbIHogcMOzbA0KWCA8LSAxOihsZW5ndGgocG9sYWN6b25lKS0yKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiY2hhcmFjdGVyXFwoMFxcKSIscG9sYWN6b25lWyxpXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKT09MCxwYXN0ZSgiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGLFgsSZZG55IHphcGlzIEJOIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIHd5ZHJ1a293YW5vIGZyYXrEmSBcImNoYXJhY3RlcigwKVwiLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIikscGFzdGUocG9sYWN6b25lJHphX2Fkbm90YWNqZSxwYXN0ZSgiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGLFgsSZZG55IHphcGlzIEJOIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIHd5ZHJ1a293YW5vIGZyYXrEmSBcImNoYXJhY3RlcigwKVwiLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksc2VwID0gIiMgIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCn0NCiN6YXN5Z25hbGl6b3dhbmllIG9iZWNub8WbY2kgem5ha3UgIyB3IG9waXNpZSB3c3DDs8WCdHfDs3Jjw7N3DQpwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiXFwjIixwb2xhY3pvbmUkemFfb3Bpc193c3BvbHR3b3Jjb3cpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobmNoYXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSk9PTAsIlVXQUdBISBaZSB3emdsxJlkdSBuYSBrb25mbGlrdCB3IG9waXNpZSB3c3DDs8WCdHfDs3Jjw7N3IHd5Ymllcnogd8WCYcWbY2l3xIUgd2FydG/Fm8SHIChzdHJlZmEgb2Rwb3dpZWR6aWFsbm/Fm2NpIFwiI1wiIHdzcMOzxYJ0d8OzcmN5IHogcG9sYSA3MDApLiIscGFzdGUocG9sYWN6b25lJHphX2Fkbm90YWNqZSwiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGtvbmZsaWt0IHcgb3Bpc2llIHdzcMOzxYJ0d8OzcmPDs3cgd3liaWVyeiB3xYJhxZtjaXfEhSB3YXJ0b8WbxIcgKHN0cmVmYSBvZHBvd2llZHppYWxub8WbY2kgIyB3c3DDs8WCdHfDs3JjeSB6IHBvbGEgNzAwKS4iLHNlcCA9ICIjICIpKSxhcy5jaGFyYWN0ZXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkpDQoNCm91dCA8LSBjU3BsaXQocG9sYWN6b25lLCBjKCJhbV9hdXRvcl9pZCIsICJhbV9uYXp3aXNrbyIsICJhbV9pbWllIiwib3Nfb3NvYmFfaWQiLCJvc19uYXp3aXNrbyIsICJvc19pbWllIiwgImZvX3N5bWJvbCIsInd5X3d5ZGF3bmljdHdvX2lkIiwid3lfbWllanNjZSIsInd5X25hendhIiksc2VwID0gInwiLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIHVuaXF1ZSgpDQoNCm91dCRyZWtvcmRfQk4gPC0gaWZlbHNlKGlzLm5hKG91dCRyZWtvcmRfQk4pLCcnLGFzLmNoYXJhY3RlcihvdXQkcmVrb3JkX0JOKSkNCm91dCRyel9uYXp3YSA8LSBpZmVsc2UoaXMubmEob3V0JHJ6X25hendhKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHJ6X25hendhKSkNCm91dCR6YV9yb19yb2sgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9yb19yb2spLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfcm9fcm9rKSkNCm91dCR6YV90eXBlIDwtIGlmZWxzZShpcy5uYShvdXQkemFfdHlwZSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90eXBlKSkNCm91dCRyel9yb2R6YWpfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCRyel9yb2R6YWpfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkcnpfcm9kemFqX2lkKSkNCm91dCREWl9OQVpXQSA8LSBpZmVsc2UoaXMubmEob3V0JERaX05BWldBKSwnJyxhcy5jaGFyYWN0ZXIob3V0JERaX05BWldBKSkNCm91dCREWl9EWklBTF9JRCA8LSBpZmVsc2UoaXMubmEob3V0JERaX0RaSUFMX0lEKSwnJyxhcy5jaGFyYWN0ZXIob3V0JERaX0RaSUFMX0lEKSkNCm91dCR0d190d29yY2FfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCR0d190d29yY2FfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkdHdfdHdvcmNhX2lkKSkNCm91dCRhbV9hdXRvcl9pZCA8LSBpZmVsc2UoaXMubmEob3V0JGFtX2F1dG9yX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGFtX2F1dG9yX2lkKSkNCm91dCRhbV9uYXp3aXNrbyA8LSBpZmVsc2UoaXMubmEob3V0JGFtX25hendpc2tvKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGFtX25hendpc2tvKSkNCm91dCRhbV9pbWllIDwtIGlmZWxzZShpcy5uYShvdXQkYW1faW1pZSksJycsYXMuY2hhcmFjdGVyKG91dCRhbV9pbWllKSkNCm91dCR6YV90eXR1bCA8LSBpZmVsc2UoaXMubmEob3V0JHphX3R5dHVsKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3R5dHVsKSkNCm91dCR6YV90eXR1bF9vcnlnaW5hbHUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90eXR1bF9vcnlnaW5hbHUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdHl0dWxfb3J5Z2luYWx1KSkNCm91dCR6YV9qZXp5a19vcnlnaW5hbHUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9qZXp5a19vcnlnaW5hbHUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfamV6eWtfb3J5Z2luYWx1KSkNCm91dCRvc19vc29iYV9pZCA8LSBpZmVsc2UoaXMubmEob3V0JG9zX29zb2JhX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JG9zX29zb2JhX2lkKSkNCm91dCRvc19uYXp3aXNrbyA8LSBpZmVsc2UoaXMubmEob3V0JG9zX25hendpc2tvKSwnJyxhcy5jaGFyYWN0ZXIob3V0JG9zX25hendpc2tvKSkNCm91dCRvc19pbWllIDwtIGlmZWxzZShpcy5uYShvdXQkb3NfaW1pZSksJycsYXMuY2hhcmFjdGVyKG91dCRvc19pbWllKSkNCm91dCRmb19zeW1ib2wgPC0gaWZlbHNlKGlzLm5hKG91dCRmb19zeW1ib2wpLCcnLGFzLmNoYXJhY3RlcihvdXQkZm9fc3ltYm9sKSkNCm91dCR6YV9vcGlzX3dzcG9sdHdvcmNvdyA8LSBpZmVsc2UoaXMubmEob3V0JHphX29waXNfd3Nwb2x0d29yY293KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX29waXNfd3Nwb2x0d29yY293KSkNCm91dCR6YV93eWRhbmllIDwtIGlmZWxzZShpcy5uYShvdXQkemFfd3lkYW5pZSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV93eWRhbmllKSkNCm91dCR6YV90b215IDwtIGlmZWxzZShpcy5uYShvdXQkemFfdG9teSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90b215KSkNCm91dCR6YV9pbnN0eXR1Y2phIDwtIGlmZWxzZShpcy5uYShvdXQkemFfaW5zdHl0dWNqYSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9pbnN0eXR1Y2phKSkNCm91dCR3eV93eWRhd25pY3R3b19pZCA8LSBpZmVsc2UoaXMubmEob3V0JHd5X3d5ZGF3bmljdHdvX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHd5X3d5ZGF3bmljdHdvX2lkKSkNCm91dCR3eV9taWVqc2NlIDwtIGlmZWxzZShpcy5uYShvdXQkd3lfbWllanNjZSksJycsYXMuY2hhcmFjdGVyKG91dCR3eV9taWVqc2NlKSkNCm91dCR3eV9uYXp3YSA8LSBpZmVsc2UoaXMubmEob3V0JHd5X25hendhKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHd5X25hendhKSkNCm91dCR6YV9yb2tfd3lkYW5pYSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3Jva193eWRhbmlhKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3Jva193eWRhbmlhKSkNCm91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2kgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2kpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfb3Bpc19maXp5Y3pueV9rc2lhemtpKSkNCm91dCR6YV9zZXJpYV93eWRhd25pY3phIDwtIGlmZWxzZShpcy5uYShvdXQkemFfc2VyaWFfd3lkYXduaWN6YSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9zZXJpYV93eWRhd25pY3phKSkNCm91dCR0d19uYXp3aXNrbyA8LSBpZmVsc2UoaXMubmEob3V0JHR3X25hendpc2tvKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHR3X25hendpc2tvKSkNCm91dCR0d19pbWllIDwtIGlmZWxzZShpcy5uYShvdXQkdHdfaW1pZSksJycsYXMuY2hhcmFjdGVyKG91dCR0d19pbWllKSkNCm91dCRwcmFjb3duaWsgPC0gaWZlbHNlKGlzLm5hKG91dCRwcmFjb3duaWspLCcnLGFzLmNoYXJhY3RlcihvdXQkcHJhY293bmlrKSkNCm91dCR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9hZG5vdGFjamUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfYWRub3RhY2plKSkNCm91dCRCTl9VUkwgPC0gaWZlbHNlKGlzLm5hKG91dCRCTl9VUkwpLCcnLGFzLmNoYXJhY3RlcihvdXQkQk5fVVJMKSkNCg0Kb3V0ICUkJSAgDQogICAgeyByZWtvcmRfQk49PWxhZyhyZWtvcmRfQk4sKSAmIHJ6X25hendhPT1sYWcocnpfbmF6d2EsKSAmIHphX3JvX3Jvaz09bGFnKHphX3JvX3JvaywpICYgemFfdHlwZT09bGFnKHphX3R5cGUsKSAmIHJ6X3JvZHphal9pZD09bGFnKHJ6X3JvZHphal9pZCwpICYgRFpfTkFaV0E9PWxhZyhEWl9OQVpXQSwpICYgRFpfRFpJQUxfSUQ9PWxhZyhEWl9EWklBTF9JRCwpICYgdHdfdHdvcmNhX2lkPT1sYWcodHdfdHdvcmNhX2lkLCkgJiB6YV90eXR1bD09bGFnKHphX3R5dHVsLCkgJiB6YV90eXR1bF9vcnlnaW5hbHU9PWxhZyh6YV90eXR1bF9vcnlnaW5hbHUsKSAmIHphX2plenlrX29yeWdpbmFsdT09bGFnKHphX2plenlrX29yeWdpbmFsdSwpICYgemFfb3Bpc193c3BvbHR3b3Jjb3c9PWxhZyh6YV9vcGlzX3dzcG9sdHdvcmNvdywpICYgemFfd3lkYW5pZT09bGFnKHphX3d5ZGFuaWUsKSAmIHphX3RvbXk9PWxhZyh6YV90b215LCkgJiB6YV9pbnN0eXR1Y2phPT1sYWcoemFfaW5zdHl0dWNqYSwpICYgemFfcm9rX3d5ZGFuaWE9PWxhZyh6YV9yb2tfd3lkYW5pYSwpICYgemFfb3Bpc19maXp5Y3pueV9rc2lhemtpPT1sYWcoemFfb3Bpc19maXp5Y3pueV9rc2lhemtpLCkgJiB6YV9zZXJpYV93eWRhd25pY3phPT1sYWcoemFfc2VyaWFfd3lkYXduaWN6YSwpICYgdHdfbmF6d2lza289PWxhZyh0d19uYXp3aXNrbywpICYgdHdfaW1pZT09bGFnKHR3X2ltaWUsKSAmIHByYWNvd25paz09bGFnKHByYWNvd25paywpICYgemFfYWRub3RhY2plPT1sYWcoemFfYWRub3RhY2plLCkgJiBCTl9VUkw9PWxhZyhCTl9VUkwsKX0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IG91dCRzYW1lDQpvdXQkc2FtZVsxXSA8LSAwDQpvdXQkZHppZWxvbmUgPC0gcGFzdGUob3V0JGFtX2F1dG9yX2lkLG91dCRhbV9uYXp3aXNrbyxvdXQkYW1faW1pZSxvdXQkb3Nfb3NvYmFfaWQsb3V0JG9zX25hendpc2tvLG91dCRvc19pbWllLG91dCRmb19zeW1ib2wsb3V0JHd5X3d5ZGF3bmljdHdvX2lkLG91dCR3eV9taWVqc2NlLG91dCR3eV9uYXp3YSxzZXAgPSAiIikNCg0Kb3V0IDwtIG91dCAlPiUNCiAgZmlsdGVyKCEoc2FtZT09MSZkemllbG9uZT09IiIpKSAlPiUNCiAgc2VsZWN0KDE6MzMpDQoNCm91dCAlJCUgIA0KICAgIHsgcmVrb3JkX0JOPT1sYWcocmVrb3JkX0JOLCkgJiByel9uYXp3YT09bGFnKHJ6X25hendhLCkgJiB6YV9yb19yb2s9PWxhZyh6YV9yb19yb2ssKSAmIHphX3R5cGU9PWxhZyh6YV90eXBlLCkgJiByel9yb2R6YWpfaWQ9PWxhZyhyel9yb2R6YWpfaWQsKSAmIERaX05BWldBPT1sYWcoRFpfTkFaV0EsKSAmIERaX0RaSUFMX0lEPT1sYWcoRFpfRFpJQUxfSUQsKSAmIHR3X3R3b3JjYV9pZD09bGFnKHR3X3R3b3JjYV9pZCwpICYgemFfdHl0dWw9PWxhZyh6YV90eXR1bCwpICYgemFfdHl0dWxfb3J5Z2luYWx1PT1sYWcoemFfdHl0dWxfb3J5Z2luYWx1LCkgJiB6YV9qZXp5a19vcnlnaW5hbHU9PWxhZyh6YV9qZXp5a19vcnlnaW5hbHUsKSAmIHphX29waXNfd3Nwb2x0d29yY293PT1sYWcoemFfb3Bpc193c3BvbHR3b3Jjb3csKSAmIHphX3d5ZGFuaWU9PWxhZyh6YV93eWRhbmllLCkgJiB6YV90b215PT1sYWcoemFfdG9teSwpICYgemFfaW5zdHl0dWNqYT09bGFnKHphX2luc3R5dHVjamEsKSAmIHphX3Jva193eWRhbmlhPT1sYWcoemFfcm9rX3d5ZGFuaWEsKSAmIHphX29waXNfZml6eWN6bnlfa3NpYXpraT09bGFnKHphX29waXNfZml6eWN6bnlfa3NpYXpraSwpICYgemFfc2VyaWFfd3lkYXduaWN6YT09bGFnKHphX3NlcmlhX3d5ZGF3bmljemEsKSAmIHR3X25hendpc2tvPT1sYWcodHdfbmF6d2lza28sKSAmIHR3X2ltaWU9PWxhZyh0d19pbWllLCkgJiBwcmFjb3duaWs9PWxhZyhwcmFjb3duaWssKSAmIHphX2Fkbm90YWNqZT09bGFnKHphX2Fkbm90YWNqZSwpICYgQk5fVVJMPT1sYWcoQk5fVVJMLCl9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiBvdXQkc2FtZQ0KDQojdWNpxJljaWUgemJ5dCBkxYJ1Z2ljaCBjacSFZ8OzdyB6bmFrw7N3LCBieSB3ZXN6xYJ5IGRvIG9yYWNsZSdhDQpkbHVnb3NjaSA8LSBkYXRhLmZyYW1lKHBvbGUgPSBjKCJhbV9uYXp3aXNrbyIsICJhbV9pbWllIiwgInphX3R5dHVsIiwgInphX3R5dHVsX29yeWdpbmFsdSIsICJ6YV9qZXp5a19vcnlnaW5hbHUiLCAib3NfbmF6d2lza28iLCAib3NfaW1pZSIsICJ6YV9vcGlzX3dzcG9sdHdvcmNvdyIsICJ6YV9pbnN0eXR1Y2phIiwgInd5X21pZWpzY2UiLCAid3lfbmF6d2EiLCAiemFfb3Bpc19maXp5Y3pueV9rc2lhemtpIiwgInphX3NlcmlhX3d5ZGF3bmljemEiLCAidHdfbmF6d2lza28iLCAidHdfaW1pZSIsICJ6YV9hZG5vdGFjamUiKSwgbGljemJhX3puYWtvdyA9IGMoNTAsNDAsNTAwLDUwMCwxMDAsNTAsNDAsNTAwLDI1NSw0MCwyNTUsMTAwMCwyNTUsMjAwLDQwLDIwMDApKQ0KeCA8LSBtYXRjaChkbHVnb3NjaSRwb2xlLG5hbWVzKG91dCkpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIGRsdWdvc2MgPC0gZGx1Z29zY2kkbGljemJhX3puYWtvd1ttYXRjaChuYW1lcyhvdXRbaV0pLGRsdWdvc2NpJHBvbGUpXQ0KICBvdXQkemFfYWRub3RhY2plIDwtIGlmZWxzZShkbHVnb3NjPG5jaGFyKGFzLmNoYXJhY3RlcihvdXRbLGldKSkmb3V0JHphX2Fkbm90YWNqZSE9IiIscGFzdGUob3V0JHphX2Fkbm90YWNqZSxwYXN0ZSgiVVdBR0EhIFBvbGUgIixhcy5jaGFyYWN0ZXIobmFtZXMob3V0W2ldKSksIiBiecWCbyB6Ynl0IGTFgnVnaWUgaSB6b3N0YcWCbyBwcnp5Y2nEmXRlLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksc2VwID0gIiMgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkbHVnb3NjPG5jaGFyKGFzLmNoYXJhY3RlcihvdXRbLGldKSkmb3V0JHphX2Fkbm90YWNqZT09IiIscGFzdGUoIlVXQUdBISBQb2xlICIsYXMuY2hhcmFjdGVyKG5hbWVzKG91dFtpXSkpLCIgYnnFgm8gemJ5dCBkxYJ1Z2llIGkgem9zdGHFgm8gcHJ6eWNpxJl0ZS4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLGFzLmNoYXJhY3RlcihvdXQkemFfYWRub3RhY2plKSkpDQogIA0KICBvdXRbLGldIDwtIGlmZWxzZShkbHVnb3NjPG5jaGFyKGFzLmNoYXJhY3RlcihvdXRbLGldKSksYXMuY2hhcmFjdGVyKHN1YnN0cihvdXRbLGldLDEsZGx1Z29zYykpLGFzLmNoYXJhY3RlcihvdXRbLGldKSkNCn0NCg0Kb3V0JHJla29yZF9CTltvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHJ6X25hendhW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfcm9fcm9rW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdHlwZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHJ6X3JvZHphal9pZFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JERaX05BWldBW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkRFpfRFpJQUxfSURbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR0d190d29yY2FfaWRbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90eXR1bFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3R5dHVsX29yeWdpbmFsdVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX2plenlrX29yeWdpbmFsdVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX29waXNfd3Nwb2x0d29yY293W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfd3lkYW5pZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3RvbXlbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9pbnN0eXR1Y2phW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfcm9rX3d5ZGFuaWFbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2lbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9zZXJpYV93eWRhd25pY3phW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkdHdfbmF6d2lza29bb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR0d19pbWllW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkcHJhY293bmlrW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfYWRub3RhY2plW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkQk5fVVJMW291dCRzYW1lID09IDFdIDwtICIiDQoNCm91dCA8LSBvdXQgJT4lDQogIHNlbGVjdCgxOjMzKQ0KDQojcMSZdGxhIHphcGlzdWrEhWNhIHBvIG9rLiAyMDAwIHdpZXJzenkgeiB1d3pnbMSZZG5pZW5pZW0ga29tcGxldG5vxZtjaSByZWtvcmTDs3cgYmlibGlvZ3JhZmljem55Y2ggcm96cGlzYW55Y2ggbmEga2lsa2Egd2llcnN6eQ0Kb3V0IDwtIG91dCAlPiUNCiAgbXV0YXRlKHBvZHppYWwgPSBpZmVsc2UocmVrb3JkX0JOIT0iIixhcy5jaGFyYWN0ZXIocmVrb3JkX0JOKSxOQSkpICU+JQ0KICBmaWxsKHBvZHppYWwpDQppbGUgPC0gdW5pcXVlKG91dCRwb2R6aWFsKQ0KaWxlIDwtIHNwbGl0KHVuaXF1ZShpbGUpLCBjZWlsaW5nKHNlcV9hbG9uZyh1bmlxdWUoaWxlKSkvMTUwMCkpDQojYWt0dWFsaXphY2phIC0gd3Bpc3ogd8WCYcWbY2l3eSByb2sgdyDFm2NpZcW8a8SZIHBsaWt1DQp4IDwtIDE6bGVuZ3RoKGlsZSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgZmluYWwgPC0gb3V0ICU+JQ0KICAgIGZpbHRlcihwb2R6aWFsICVpbiUgaWxlW1tpXV0pICU+JQ0KICAgIHNlbGVjdCgtcG9kemlhbCkNCiAgd3JpdGUueGxzeChmaW5hbCwgcGFzdGUoIkM6L1VzZXJzL0NlemFyeS9EZXNrdG9wLzIwMTFfd3Nwb2x3eWRhbmllX2RvX2ltcG9ydHUiLGksIi54bHN4IixzZXAgPSAiIiksc2hlZXROYW1lID0gImdvdG93ZSIpDQp9DQpgYGANCg0KYmV6cGllY3puaWsNClVXQUdBIQ0KTmFqcGllcncgbmFsZcW8eSBwcnplcHJvd2FkemnEhyBpbXBvcnQgZG8gYmF6eSwgYSBuYXN0xJlwbmllIGVnemVrd293YcSHIHBvbmnFvHN6xIUgY3rEmcWbxIcga29kdQ0KDQpgYGB7ciByxJljem5hIGtvcmVrcnRhIGltcG9ydHV9DQojdyBmb3JtdWxhcnp1IGtzacSFxbxrb3d5bSB3eXN6dWthaiB3IHBvbHUgdXdhZyBmcmF6xJkgJyVha2NlcHR1amU6TkElJyBpIC0gamXFm2xpIHRha293YSB3eXN0xIVwaSAtIHphc3TEhXAgTkEgaW1pZW5pZW0gd8WCYcWbY2l3ZWdvIHByYWNvd25pa2ENCiN3aWVtLCDFvGUgdG8gc2thc293YWxpxZtteSwgYWxlIGRvc3plZMWCZW0gZG8gd25pb3NrdSwgxbxlIGplZG5hayB3YXJ0byB0byBzcHJhd2R6acSHDQpgYGANCg0KDQpgYGB7ciBwcnp5Z290b3dhbmllIHBsaWvDs3cgZG8gbWFzb3dlZ28gbmFkcGlzYW5pYSBzdGF0dXN1IElPS30NCiNhdXRvbWF0eWN6bnkgSU9LIGRsYSByZWtvcmTDs3cgYmlibGlvZ3JhZmljem55Y2gNCiNha3R1YWxpemFjamEgLSB3cGlzeiB3xYJhxZtjaXd5IHJvayB3IMWbY2llxbxrxJkgcGxpa3UNCg0KbmFkcGlzYW5pZV96YXBpc293X0lPSyA8LSByZWFkLmNzdjIoIkM6L1VzZXJzL0NlemFyeS9EZXNrdG9wL2ltcF8yMDExX2F1dG9tYXR5Y3puZV9wb2RtaW90b3dlLmNzdiIsIGVuY29kaW5nID0gIlVURi04IiwgaGVhZGVyID0gVFJVRSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KDQojYWt0dWFsaXphY2phIC0gd3Bpc2HEhyB3IHNlbGVrY2llIGRsYSB6YV91d2FnaSB3xYJhxZtjaXfEhSBmcmF6xJkgZGxhIHJvY3puaWthLCBucC4gJ0JOOiAyMDA5JScNCm5hZHBpc2FuaWVfemFwaXNvd19JT0sgPC0gbmFkcGlzYW5pZV96YXBpc293X0lPSyAlPiUNCiAgbXV0YXRlKHJla29yZF9CTiA9IGFzLmNoYXJhY3RlcihyZWtvcmRfQk4pKSAlPiUgDQogIGxlZnRfam9pbiguLGRiR2V0UXVlcnkoUEJMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IHouemFfemFwaXNfaWQsIHouemFfc3RhdHVzX2ltcCwgei56YV91d2FnaQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwYmxfemFwaXN5IHoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHphX3V3YWdpIGxpa2UgJ0JOOiAyMDExJScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB6LnphX3VybF9ibiBpcyBub3QgbnVsbCIpICU+JSBtdXRhdGUoWkFfVVdBR0kgPSBzdHJfZXh0cmFjdChaQV9VV0FHSSwiKD88PUJOOiApKC4qPykoPz0sIGltcG9ydCkiKSksYnk9YygicmVrb3JkX0JOIj0iWkFfVVdBR0kiKSkgJT4lIA0KICByZW5hbWUoamVzdCA9IFpBX1NUQVRVU19JTVApICU+JSANCiAgbXV0YXRlKElEMiA9IE5BKSAlPiUgDQogIHNlbGVjdChaQV9aQVBJU19JRCxJRDIsamVzdCxwb3dpbm5vX2J5YykNCiNha3R1YWxpemFjamEgLSB3cGlzeiB3xYJhxZtjaXd5IHJvayB3IMWbY2llxbxrxJkgcGxpa3UNCndyaXRlLnhsc3gobmFkcGlzYW5pZV96YXBpc293X0lPSywgIkM6L1VzZXJzL0NlemFyeS9EZXNrdG9wLzIwMTFfbmFkcGlzYW5pZV96YXBpc293X0lPSy54bHN4IixzaGVldE5hbWUgPSAiWkFfU1RBVFVTX0lNUCIpDQoNCiNiZXpwaWVjem5paw0KI2F1dG9tYXR5Y3pueSBJT0sgZGxhIG5vd3ljaCB0d8OzcmPDs3cgdyBrYXJ0b3RlY2UgcG93aW5pZW4gem9zdGHEhyBwcnplcHJvd2Fkem9ueSB6IHBvemlvbXUgaW1wb3J0ZXJhDQoNCiNhdXRvbWF0eWN6bmllIG5hZHBpc2HEhyByZWtvcmR5IGJpYmxpb2dyYWZpY3puZSBpIGthcnRvdGVjem5lIHByemVkIGtvbGVqbnltIGtyb2tpZW0NCg0KI2JlenBpZWN6bmlrDQojamXFm2xpIHBvZGN6YXMgaW1wb3J0dSBuaWUgZGEgc2nEmSB6YWltcG9ydG93YcSHIHJla29yZMOzdyAtIHdwcm93YWTFuiBqZSByxJljem5pZSB3IHR5bSBtb21lbmNpZQ0KI2tvbHVtbsSZIEJOLVVSTCBuYWxlxbx5IG5hZHBpc2HEhyBhdXRvbWF0eWN6bmllDQpgYGANCg0KYGBge3IgcHJ6eWdvdG93YW5pZSBsaXN0IHByYWNvd25pa8Ozd30NCiNkb2NlbG93byBwcnp5Z290b3d1amVteSBwbGlrIG9kIHJhenUgbmEgZHlzaywgYWxlIG5hIHJhemllIHhsc3ggZG8gd2dyYW5pYSBuYSBkeXNrIChicmFrIGZ1bmtjam9uYWxub8WbY2kgZ29vZ2xlc2hlZXRzNCkNCiNwbyB0eW0gcHJ6eWdvdG93YcSHIG5hIGR5c2t1IHVuaWthdG93ZSBsaW5raQ0KYm5fb2sgPC0gY2h1bmsxMQ0Ka29sZWpub3NjIDwtIGMoInByYWNvd25payIsIlpBX1pBUElTX0lEIiwidHlwX2tzaWF6a2kiLCJsaW5rIiwibGlua18xIiwicm9rIiwic3RhdHVzIiwiYmxhZF93X2ltcG9yY2llX3R5dHVsdSIsIlgxMDAiLCJYMjQ1IiwiWDY1MCIsIlg2NTUiLCJYMjQ2IiwiWDI1MCIsIlgyNjAiLCJYMzAwIiwiWDM4MCIsIlg0OTAiLCJYNTAwIiwiWDUwMSIsIlg1NDYiLCJYNjAwIiwiWDcwMCIsIlgwNDEiLCJYMDgwIikNCiNha3R1YWxpemFjamEgLSB3cGlzYcSHIHcgc2VsZWtjaWUgZGxhIHphX3V3YWdpIHfFgmHFm2Npd8SFIGZyYXrEmSBkbGEgcm9jem5pa2EsIG5wLiAnQk46IDIwMTAlJw0Kcm9jem5pa19wYmxfcG9faW1wb3JjaWUgPC0gZGJHZXRRdWVyeShQQkwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IHouemFfemFwaXNfaWQsIHouemFfc3RhdHVzX2ltcCwgei56YV91d2FnaQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gcGJsX3phcGlzeSB6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgemFfdXdhZ2kgbGlrZSAnQk46IDIwMTElJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB6LnphX3VybF9ibiBpcyBub3QgbnVsbCIpICU+JSANCiAgbXV0YXRlKFpBX1VXQUdJID0gc3RyX2V4dHJhY3QoWkFfVVdBR0ksIig/PD1CTjogKSguKj8pKD89LCBpbXBvcnQpIikpICU+JQ0KICByZW5hbWUoc3RhdHVzID0gWkFfU1RBVFVTX0lNUCkgJT4lIA0KICBsZWZ0X2pvaW4oLixibl9vayAlPiUgc2VsZWN0KHByYWNvd25payA9IHJlZGFrdG9yX2R6aWFsdSx0eXBfa3NpYXpraSA9IHJvZHphal9rc2lhemtpLGxpbmsgPSBCTl9VUkwsIHJvaywgWDEwMCwgWDI0NSwgWDY1MCwgWDY1NSwgWDI0NiwgWDI1MCwgWDI2MCwgWDMwMCwgWDM4MCwgWDQ5MCwgWDUwMCwgWDUwMSwgWDU0NiwgWDYwMCwgWDcwMCwgWDA0MSwgWDA4MCxaQV9VV0FHSSkgJT4lIG11dGF0ZShsaW5rXzEgPSBwYXN0ZSgiPUhZUEVSTElOSyhcIiIsbGluaywiXCI7XCJsaW5rIGRvIGtzacSFxbxraSB3IEJOXCIpIixzZXAgPSAiIiksIGJsYWRfd19pbXBvcmNpZV90eXR1bHUgPSBGQUxTRSksYnk9IlpBX1VXQUdJIikgJT4lIA0KICBzZWxlY3Qobm9xdW90ZShrb2xlam5vc2MpKQ0Kcm9jem5pa19wYmxfcG9faW1wb3JjaWUkcHJhY293bmlrW3JvY3puaWtfcGJsX3BvX2ltcG9yY2llJHN0YXR1cz09IklPSyJdIDwtICJBVVRPTUFUIg0KI2FrdHVhbGl6YWNqYSAtIHdwaXN6IHfFgmHFm2Npd3kgcm9rIHcgxZtjaWXFvGvEmSBwbGlrdQ0Kd3JpdGUueGxzeChyb2N6bmlrX3BibF9wb19pbXBvcmNpZSwgIkM6L1VzZXJzL0NlemFyeS9EZXNrdG9wL2tzX0JOXzIwMTFfbGlzdHlfcHJhY293bmlrw7N3Lnhsc3giLHNoZWV0TmFtZSA9ICJsaXN0YV9rc2lhemVrIikNCiN1dHfDs3J6IG5vd3kgcG9kZm9sZGVyIHcgZm9sZGVyemUgaW1wb3J0dSBCTiBpIHByemXFm2xpaiBsaXN0xJkgbmEgZHlzaywgcHJ6eWdvdHVqIHdpZG9raSBmaWx0csOzdyBkbGEgd3N6eXN0a2ljaCBvc8OzYiBpIHJvemXFm2xpaiB1bmlrYXRvd2UgbGlua2kNCmBgYA0KDQpgYGB7ciBha3R1YWxpemFjamEgcmVsYWNqaSBvc8OzYiBQQkwtQk59DQojVFVUQUogLSB6cm9iacSHIGRvcGllcm8gcG8gaW1wb3JjaWUgMjAxMCEhIQ0KI2Jhem93YcSHIG5hIGJuX29rIHogemFweXRhbmllbSBTUUwgZHppxJlraSB6YXdhcnRvxZtjaSBwb2xhIGJuIHJla29yZA0KI3pha3R1YWxpem93YcSHIHBsaWsgbmEgZHlza3U6ICJtYXBvd2FuaWVfb3NvYl9ibl9wYmxfcG9faW1wb3JjaWUiIG8gbm93ZSByZWxhY2plIG9zb2Jvd2UgcGJsLWJuDQpibl9vayA8LSBjaHVuazExDQpub3dlX3JlbGFjamUgPC0gYm5fb2sgJT4lIA0KICBmaWx0ZXIoaXMubmEoVFdfVFdPUkNBX0lEKSYhaXMubmEoVFdfTkFaV0lTS08pKSAlPiUgDQogIHNlbGVjdChYMTAwLFRXX05BWldJU0tPLFRXX0lNSUUpICU+JSANCiAgZmlsdGVyKCFncmVwbCgiXFx8IixYMTAwKSkgJT4lIA0KICB1bmlxdWUoKSAlPiUgDQogIG11dGF0ZShsaWN6bmlrID0gMTpucm93KC4pKQ0KDQptYXJjX2ZpZWxkXzEwMCA8LSBub3dlX3JlbGFjamUgJT4lDQogIHNlbGVjdChsaWN6bmlrLFgxMDApJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZW1vdmVfYWxsKFgxMDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChub3dlX3JlbGFjamUkWDEwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzEwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8xMDA8LWNiaW5kKG1hcmNfZmllbGRfMTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMTAwJFgxMDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8xMDAkWDEwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8xMDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8xMDAkWDEwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMTAwJFgxMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0Kbm93ZV9yZWxhY2plIDwtIG5vd2VfcmVsYWNqZSAlPiUgDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMTAwICU+JSB1bml0ZSgiQk5fb3NvYmEiLGAkYWA6YCRjYCxzZXAgPSAiICIsbmEucm0gPSBUUlVFKSAlPiUgc2VsZWN0KGxpY3puaWssQk5fb3NvYmEpLGJ5PSJsaWN6bmlrIikgJT4lIA0KICBsZWZ0X2pvaW4oLixkYkdldFF1ZXJ5KFBCTCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCB0dy50d190d29yY2FfaWQsdHcudHdfbmF6d2lza28sdHcudHdfaW1pZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwYmxfdHdvcmN5IHR3IiksYnk9YygiVFdfTkFaV0lTS08iLCJUV19JTUlFIikpICU+JQ0KICBzZWxlY3QoVFdfVFdPUkNBX0lELFRXX05BWldJU0tPLFRXX0lNSUUsQk5fb3NvYmEpDQoNCnBibF9ibl9pbXBvcnQgPC0gZGF0YS5mcmFtZShzdHJpbmdzQXNGYWN0b3JzPUZBTFNFKQ0KeCA8LSAxOmxlbmd0aChub3dlX3JlbGFjamUkVFdfVFdPUkNBX0lEKQ0KDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICB0cnlDYXRjaCh7IA0KICBpZCA8LSBqc29ubGl0ZTo6ZnJvbUpTT04oc3RyX3JlcGxhY2VfYWxsKHBhc3RlKCJodHRwczovL2RhdGEuYm4ub3JnLnBsL2FwaS9hdXRob3JpdGllcy5qc29uP2xpbWl0PTEwMCZuYW1lPSIsbm93ZV9yZWxhY2plJEJOX29zb2JhW2ldLHNlcCA9ICIiKSwiICIsIiUyMCIpKSAlPiUgLiRhdXRob3JpdGllcyAlPiUgDQogICAgZmlsdGVyKHRpdGxlPT0iIikgJT4lIC4kaWQNCiAgaWYgKGxlbmd0aChpZCk9PTApIHsNCiAgICBpZCA8LSAiYnJhayBkYW55Y2ggKENSKSINCiAgfSANCiAgfSwgZXJyb3I9ZnVuY3Rpb24oZSl7DQogICAgICAgICAgICAgICAgICAgICBpZCA8PC0gImJyYWsgZGFueWNoIChDUikiDQogIH0pDQogIGl0ZXJhdGlvbiA8LSBkYXRhLmZyYW1lKG5vd2VfcmVsYWNqZSAlPiUgc2VsZWN0KDE6NCkgJT4lIHNsaWNlKGkpLCBpZCA9IGlkKQ0KICBwYmxfYm5faW1wb3J0IDwtIHJiaW5kKHBibF9ibl9pbXBvcnQsaXRlcmF0aW9uKQ0KfQ0KDQpwYmxfYm5faW1wb3J0X2ZpeCA8LSBwYmxfYm5faW1wb3J0ICU+JSANCiAgZmlsdGVyKGlkPT0iYnJhayBkYW55Y2ggKENSKSIpDQpwYmxfYm5faW1wb3J0IDwtIHBibF9ibl9pbXBvcnQgJT4lIA0KICBmaWx0ZXIoaWQgJW5vdGluJSBwYmxfYm5faW1wb3J0X2ZpeCRpZCkNCiNha3R1YWxpemFjamEgLSByxJljem5pZSB1enVwZcWCbmlqIGlkZW50eWZpa2F0b3J5IGRsYSBvc8OzYiBCTiwga3TDs3JlIG5pZSB6b3N0YcWCeSB6bmFsZXppb25lIGF1dG9tYXR5Y3puaWUgKHN6dWthaiBwcnp5IHXFvHljaXUveiB3eWtsdWN6ZW5pZW0gem5ha8OzdyBkaWFrcnl0eWN6bnljaCwgcG8gZnJhZ21lbnRhY2ggc3RyaW5nw7N3KQ0KI3N6dWthaiB3IHNjaGVtYWNpZTpodHRwOi8vZGF0YS5ibi5vcmcucGwvYXBpL2F1dGhvcml0aWVzLmpzb24/bGltaXQ9MTAwJm5hbWU9S2FybCUyME92ZSUyMCgxOTY4LSUyMCkgcG9kbWllbmlhasSFYyB3YXJ0b8WbY2kgcG8gIm5hbWU9Ig0KIyBqZcWbbGkgbmllbW8gemxpd2UgamVzdCB1c3RhbGVuaWUgaWQgdyBvYmlla2NpZSByZWN6bmVfdXp1cGVsbmllbmllIHcgb2Rwb3dpZWRuaW0gbWllanNjdSB3c3RhdyBmcmF6xJkgImJyYWsgZGFueWNoIChDUikiDQpyZWN6bmVfdXp1cGVsbmllbmllIDwtIGMoMTA5ODc2OCwyNTI1ODY1LDEyMTI2NjIsMjU1MDA5MywyODM4NTU0LDE3MDA3ODIsMjcwNTQwMSwyNTM1MTg3LCJicmFrIGRhbnljaCAoQ1IpIiwzMTgzMjQ2LDIyNTk0NTQsMjQyODgyMCwzMTM0MDI1LCJicmFrIGRhbnljaCAoQ1IpIiwyODg0Nzg1LDEwNzAwNjYsImJyYWsgZGFueWNoIChDUikiLDI4MTg1NzgsMjQzNzQwNiwxMTgyMTg5LDE2MjQ0ODksImJyYWsgZGFueWNoIChDUikiLCJicmFrIGRhbnljaCAoQ1IpIiwyNTIwNTE5LDI4MTI0OTUsImJyYWsgZGFueWNoIChDUikiKQ0KcGJsX2JuX2ltcG9ydF9maXgkaWQgPC0gcmVjem5lX3V6dXBlbG5pZW5pZQ0KcGJsX2JuX2ltcG9ydCA8LSBwYmxfYm5faW1wb3J0ICU+JSANCiAgYmluZF9yb3dzKHBibF9ibl9pbXBvcnRfZml4ICU+JSBmaWx0ZXIoaWQgIT0gImJyYWsgZGFueWNoIChDUikiKSkNCg0KcGJsX2JuX3ZpYWZfaW1wb3J0IDwtIGRhdGEuZnJhbWUoc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSkNCnggPC0gMTpsZW5ndGgocGJsX2JuX2ltcG9ydCRUV19UV09SQ0FfSUQpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIG5hbWUgPC0gcGFzdGUoc3RyX3JlcGxhY2VfYWxsKHN0cl9yZW1vdmVfYWxsKHBhc3RlKHVubGlzdChqc29ubGl0ZTo6ZnJvbUpTT04ocGFzdGUoImh0dHBzOi8vZGF0YS5ibi5vcmcucGwvYXBpL2F1dGhvcml0aWVzLmpzb24/aWQ9IixwYmxfYm5faW1wb3J0JGlkW2ldLHNlcCA9ICIiKSkgJT4lIC4kYXV0aG9yaXRpZXMgJT4lIC4kbWFyYyAlPiUgLiRmaWVsZHMgJT4lIGBbW2AoMSkgJT4lIC4kYDEwMGAgJT4lIGBbW2AoMykpLGNvbGxhcHNlID0gInwiKSwiXFx8TkEiKSwiKFxcfCkoXFwoXFxkKykiLCIgXFwyIiksc3RyX3JlcGxhY2VfYWxsKHN0cl9yZW1vdmVfYWxsKHBhc3RlKHVubGlzdChqc29ubGl0ZTo6ZnJvbUpTT04ocGFzdGUoImh0dHBzOi8vZGF0YS5ibi5vcmcucGwvYXBpL2F1dGhvcml0aWVzLmpzb24/aWQ9IixwYmxfYm5faW1wb3J0JGlkW2ldLHNlcCA9ICIiKSkgJT4lIC4kYXV0aG9yaXRpZXMgJT4lIC4kbWFyYyAlPiUgLiRmaWVsZHMgJT4lIGBbW2AoMSkgJT4lIC4kYDQwMGAgJT4lIGBbW2AoMykpLGNvbGxhcHNlID0gInwiKSwiXFx8TkEiKSwiKFxcfCkoXFwoXFwuKykiLCIgXFwyIiksc2VwID0gInwiKQ0KICB2aWFmIDwtIHN0cl9yZW1vdmVfYWxsKHBhc3RlKHVubGlzdChqc29ubGl0ZTo6ZnJvbUpTT04ocGFzdGUoImh0dHBzOi8vZGF0YS5ibi5vcmcucGwvYXBpL2F1dGhvcml0aWVzLmpzb24/aWQ9IixwYmxfYm5faW1wb3J0JGlkW2ldLHNlcCA9ICIiKSkgJT4lIC4kYXV0aG9yaXRpZXMgJT4lIC4kbWFyYyAlPiUgLiRmaWVsZHMgJT4lIGBbW2AoMSkgJT4lIC4kYDAyNGAgJT4lIC4kc3ViZmllbGRzKSxjb2xsYXBzZSA9ICJ8IiksIihcXHxOQSl8KFxcfHZpYWYpIikNCiAgaXRlcmF0aW9uIDwtIGRhdGEuZnJhbWUocGJsX2JuX2ltcG9ydCAlPiUgc2VsZWN0KDE6Myw1KSAlPiUgc2xpY2UoaSksIG5hbWUgPSBuYW1lLCB2aWFmID0gdmlhZikNCiAgcGJsX2JuX3ZpYWZfaW1wb3J0IDwtIHJiaW5kKHBibF9ibl92aWFmX2ltcG9ydCxpdGVyYXRpb24pDQp9DQoNCnBibF9ibl92aWFmX2ltcG9ydCA8LSBwYmxfYm5fdmlhZl9pbXBvcnQgJT4lIA0KICByZW5hbWUocGJsX2lkID0gVFdfVFdPUkNBX0lELA0KICAgICAgICAgcGJsX25hendpc2tvID0gVFdfTkFaV0lTS08sDQogICAgICAgICBwYmxfaW1pZSA9IFRXX0lNSUUsDQogICAgICAgICBCTl9pZCA9IGlkLA0KICAgICAgICAgQk5fbmFtZSA9IG5hbWUpICU+JSANCiAgbXV0YXRlKGN6eV90ZW5fc2FtID0gInRhayIpICU+JSANCiAgc2VsZWN0KHBibF9pZCxwYmxfbmF6d2lza28scGJsX2ltaWUsQk5faWQsQk5fbmFtZSxjenlfdGVuX3NhbSx2aWFmKSAlPiUgDQogIHVuaXF1ZSgpDQoNCiN6YXBpc2HEhyBwbGlrIGkgamVnbyB0cmXFm8SHIHdrbGVpxIcgbmEgZHlzayBkbyB0YWJlbGkgIm1hcG93YW5pZV9vc29iX2JuX3BibF9wb19pbXBvcmNpZSINCndyaXRlLnhsc3gocGJsX2JuX3ZpYWZfaW1wb3J0LCAiQzovVXNlcnMvQ2V6YXJ5L0Rlc2t0b3AvcmVsYWNqZV9vc29ib3dlX3BibF9ibi54bHN4IixzaGVldE5hbWUgPSAicGJsLWJuIikNCiNuYXN0xJlwbmllIHByemVhbmFsaXpvd2HEhyB6YXdhcnRvxZvEhyB3a2Vqb25laiBjesSZxZtjaSBpIHpvc3Rhd2nEhyAidGFrIiB3IGtvbHVtbmllIEYgdHlsa28gZGxhIHBvcHJhd255Y2ggdXRvxbxzYW1pZcWEIChvc29iYSB3IFBCTCB0byBvc29iYSB3IEJOKQ0KYGBgDQoNCg==